Victoria Property Market Analysis

The data is already scraped from realestate.com.au and saved as a csv file containing 870000 rows.

In [2]:
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from bs4 import BeautifulSoup as bs
import time
import datetime
import warnings
warnings.filterwarnings('ignore')
In [3]:
df = pd.read_csv('SOLD_complete.csv')
In [4]:
df.head()
Out[4]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
0 2/5-7 Princes Street, Abbotsford Collins Simms - Inner North None None 1 1 1 $270,000 Apartment Sold on 30 May 2015 Abbotsford 2019-01-05 17:24:35.774257
1 310A/11 Flockhart St, Abbotsford Ray White - Ringwood None None 1 1 1 $299,000 Apartment Sold on 06 Sep 2017 Abbotsford 2019-01-05 17:24:35.776254
2 704/20 Shamrock Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 None $300,000 Apartment Sold on 08 Sep 2017 Abbotsford 2019-01-05 17:24:35.778246
3 6/241 Nicholson Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 1 $300,000 Apartment Sold on 08 Oct 2016 Abbotsford 2019-01-05 17:24:35.780241
4 10/20 Valiant Street, Abbotsford LJ Hooker - Boronia Julien Karolos Agent: 1 1 1 $300,000 Apartment Sold on 05 Jun 2010 Abbotsford 2019-01-05 17:24:35.782235
In [5]:
df.describe()
Out[5]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
count 880469 880469 880469 880469 880469 880469 880469 880469 880469 880061 880469 880469
unique 645745 2398 7161 2 23 29 45 13248 25 4925 2250 880469
top Address available on request, Wonthaggi None None None 2 3 2 Contact agent House Sold on 28 Oct 2017 Mornington 2019-01-06 02:26:57.412887
freq 1245 46087 496769 654379 390974 387620 379368 353180 625866 892 14045 1
In [6]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 880469 entries, 0 to 880468
Data columns (total 12 columns):
address          880469 non-null object
agency           880469 non-null object
agent_name       880469 non-null object
agent_title      880469 non-null object
baths            880469 non-null object
beds             880469 non-null object
cars             880469 non-null object
price            880469 non-null object
property_type    880469 non-null object
sold_date        880061 non-null object
suburb           880469 non-null object
time             880469 non-null object
dtypes: object(12)
memory usage: 80.6+ MB
In [7]:
df.agency.value_counts()
Out[7]:
None                                                                                         46087
Jellis Craig & Company Pty Ltd - HAWTHORN                                                     5764
PRD Nationwide - Ballarat                                                                     4796
PBE Real Estate - Wonthaggi                                                                   4336
Harcourts Rata & Co - Thomastown-Lalor, Epping-Wollert, Mill Park-South Morang, Reservoir     4155
Hayeswinckle - Highton                                                                        4010
Marshall White - Stonnington                                                                  3766
Harcourts - Ballarat                                                                          3569
hockingstuart - Ballarat                                                                      3403
Eview Group - Corporate                                                                       3336
Tweed Sutherland First National - Bendigo                                                     3323
Miles Real Estate - Ivanhoe & Rosanna                                                         3302
Love & Co                                                                                     3287
Clark NextRE -                                                                                3184
Buxton - Newtown                                                                              3164
Ray White Oakleigh -                                                                          3147
Jellis Craig  - Stonnington                                                                   3102
Judith Wright Stockdale & Leggo - Phillip Island                                              3077
Nelson Alexander - Essendon                                                                   2965
Bellarine Property                                                                            2950
Ray White - Cranbourne                                                                        2840
Gary Peer & Associates - Caulfield North                                                      2835
Bendigo Real Estate - Bendigo                                                                 2830
Barry Plant - Taylors Lakes                                                                   2766
Morrison Kleeman Estate Agents Greensborough Doreen - Eltham                                  2745
Ballarat Real Estate - Ballarat                                                               2741
Barry Plant - Mitchell Shire                                                                  2700
Neville Richards Real Estate - St Leonards                                                    2677
Barry Plant - Doncaster East                                                                  2577
McGrath - Geelong                                                                             2571
                                                                                             ...  
Eview Group - Badiha Cook Property                                                               1
AV Jennings                                                                                      1
Raine & Horne Reservoir                                                                          1
Elders Real Estate - Merimbula                                                                   1
L J Hooker - COOLUM BEACH                                                                        1
Setia - Melbourne                                                                                1
Faisky                                                                                           1
Jackson Green - Subscription                                                                     1
Accord Real Estate Services - CANTERBURY                                                         1
Vystal Living - HAMILTON                                                                         1
AUSSTTRAMEL Real Estate - MELBOURNE                                                              1
Wayland Property - SOUTH MELBOURNE                                                               1
Global Realty Partners - NEW LAMBTON                                                             1
WILLIAMS SHARP - SOUTHBANK                                                                       1
B. Hayes Real Estate Pty Ltd - YARRAWONGA                                                        1
Nelson Alexander - FITZROY                                                                       1
Naked Real Estate - Cannington                                                                   1
Satterley Property Group - Coburg Hill Project                                                   1
Beulah International - Melbourne                                                                 1
Pippin & Hall Real Estate - Errinundra                                                           1
360 Property Group - Lakeside - Melbourne                                                        1
Aus Investors Pty Ltd - NORTH MELBOURNE                                                          1
Carter Humphries - Prahran                                                                       1
Your Property Manager - Sandringham                                                              1
Property Holdings Real Estate                                                                    1
Barry Plant - Newport                                                                            1
LSP Realty - Elwood                                                                              1
Best Property (Australia) Pty Ltd                                                                1
Bixby Real Estate - HUNTINGDALE                                                                  1
Fletchers Projects - Avant                                                                       1
Name: agency, Length: 2398, dtype: int64
In [8]:
df.agent_name.value_counts()
Out[8]:
None                            496769
Sales Department - Wonthaggi      1998
Luke Campbell                     1498
Michelle Winckle                   931
Mark Dudley                        930
Shane Spiteri                      902
Tony Moorfoot                      865
Anthony Rabl                       847
Ben Riddle                         775
Barry Plant Mitchell Shire         760
Marshall Rushford                  746
Terry Cleary                       719
Daniel Lawrie                      717
Helen Ryan                         710
Ben Roberts                        697
Jason Gigliotti                    675
Rachelle Potts                     661
Brian Mark Real Estate .           659
Las Anastasiadis                   654
Kayla Ridolfi                      649
Daniel Lamanna                     641
Joe Mavrikos                       628
Christian Bartley                  620
Michael O'Sullivan                 612
Kayn Luff                          592
Glenn Grech                        592
Adam Natonewski                    575
Mark Di Giulio                     565
Laurie Keady                       564
Wayne Smith                        558
                                 ...  
Janice Lam                           1
Francis Van Gulick                   1
Richard Houen                        1
Andrew Sahhar                        1
Marnee Jablonski                     1
Michael Cementon                     1
Peter Wu                             1
Gina Yang                            1
Gaurav (Garry) Jhamb                 1
Tanya Sanchez                        1
Tina Knights                         1
Chris Moreira                        1
Tom Symons                           1
Alex Kovacevic                       1
Ishika Kohli                         1
Gerard Gray                          1
Miranda Pike                         1
James Taylor                         1
Wes Dorrington                       1
Lisa Suryawan                        1
Tinh Nguyen                          1
Bo Qiang                             1
Louis Nguyen                         1
Lionel Liebowitz                     1
Kul Pathania                         1
Andrew Jose                          1
Vish Prashad                         1
Tavis Chivers                        1
Luke Mealor                          1
Russell Birch                        1
Name: agent_name, Length: 7161, dtype: int64
In [9]:
df.property_type.value_counts()
Out[9]:
House                   625866
Unit                     69740
Residential Land         60370
Apartment                57736
Townhouse                43848
Acreage                   5603
Lifestyle                 5439
Other                     2921
Villa                     2705
Farmlet                   1262
Livestock                  779
Studio                     691
Block Of Units             628
Mixed Farming              620
Flat                       499
Cropping                   339
Retirement Living          300
Duplex/Semi-detached       263
Terrace                    208
Warehouse                  202
Dairy                      185
Alpine                     111
Horticulture                69
Viticulture/vineyard        48
Serviced Apartment          37
Name: property_type, dtype: int64
In [10]:
df.suburb.value_counts()
Out[10]:
Mornington              14045
Geelong                 12890
Melton                  10394
Bellarine                9665
Ballarat                 8039
Grantville               7797
Bendigo                  7102
Pakenham                 7053
Berwick                  6747
Frankston                6606
Melbourne                6318
Mount Dandenong          6181
Craigieburn              5822
Macedon                  5585
Sunbury                  5464
Reservoir                5407
Tarneit                  5187
Werribee                 4981
Broadford                4930
Hoppers Crossing         4798
Bacchus Marsh            4784
Moorabool                4784
mornington,+vic+3931     4757
Point Cook               4601
Traralgon                4591
Bairnsdale               4541
Mildura                  4169
Korumburra               4135
Leongatha                4135
Sale                     4000
                        ...  
Dingwall                    1
Adams Estate                1
Lucyvale                    1
Browns Plains               1
Ballarat West               1
Timbarra                    1
Grass Flat                  1
Dixie                       1
Boonah                      1
Hotham Heights              1
Vervale                     1
Foxhow                      1
Mcintyre                    1
Gillieston                  1
Tambo Crossing              1
Codrington                  1
Ercildoune                  1
Lake Eildon                 1
Blackwood Forest            1
Macorna                     1
Maramingo Creek             1
Curyo                       1
Riggs Creek                 1
Anderson                    1
Kulwin                      1
Bridge Creek                1
Jancourt                    1
Quandong                    1
Chetwynd                    1
Boho                        1
Name: suburb, Length: 2250, dtype: int64
In [11]:
df[df[['address','sold_date']].duplicated()]
Out[11]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
391 25 Yarra Bank Court, Abbotsford Nelson Alexander - Fitzroy None None None None None Contact agent Residential Land Sold on 11 Dec 2010 Abbotsford 2019-01-05 17:24:48.509064
682 3 Trenerry Crescent, Abbotsford Nelson Alexander - Fitzroy Roland Paterson Agent: 1 2 None $925,000 House Sold on 18 Apr 2015 Abbotsford 2019-01-05 17:25:00.480473
683 3 Trenerry Crescent, Abbotsford Nelson Alexander - Fitzroy Roland Paterson Agent: 1 2 None $925,000 House Sold on 18 Apr 2015 Abbotsford 2019-01-05 17:25:00.482470
957 11/37 St Kinnord Street, Aberfeldie Nelson Alexander - Essendon Barry Hamond None 1 1 1 $275,000 Apartment Sold on 23 Nov 2015 Aberfeldie 2019-01-05 17:25:13.748578
1480 3 Lighthouse Road, Aireys Inlet Great Ocean Road Real Estate - ANGLESEA None None 1 3 None $600,000 House Sold on 26 Jan 2010 Aireys Inlet 2019-01-05 17:25:41.436028
1515 52 Aireys Street, Aireys Inlet Great Ocean Road Real Estate - ANGLESEA None None 1 4 2 $680,000 House Sold on 09 Sep 2012 Aireys Inlet 2019-01-05 17:25:42.166978
1607 42B Bambra Road, Aireys Inlet Great Ocean Properties - Aireys Inlet Marty Maher Agent: None None None $970,000 Residential Land Sold on 01 Apr 2016 Aireys Inlet 2019-01-05 17:25:45.053766
1651 2/67 Roberts Road, Airport West Nelson Alexander - Essendon None None 1 3 2 Contact agent Unit Sold on 15 May 2009 Airport West 2019-01-05 17:25:47.751295
1670 26 Laurence Avenue, Airport West Nelson Alexander - Keilor East None None 1 1 None Contact agent House Sold on 05 Apr 2012 Airport West 2019-01-05 17:25:48.544509
3455 28 Herbert Place, Albert Park Cayzer Real Estate - Port Melbourne None None 1 2 None Contact agent House Sold on 25 Jul 2009 Albert Park 2019-01-05 17:26:52.525243
3617 122 Richardson Street, Albert Park Cayzer Real Estate - Albert Park None None 2 4 1 Contact agent House Sold on 06 Jul 2009 Albert Park 2019-01-05 17:26:57.933914
3645 5 Withers Street, Albert Park Marshall White - Port Phillip None None 1 3 None Contact agent House Sold on 10 Sep 2016 Albert Park 2019-01-05 17:26:58.730135
3706 33 Withers Street, Albert Park RT Edgar - Albert Park None None 1 2 None Contact agent House Sold on 27 May 2017 Albert Park 2019-01-05 17:27:00.500184
3707 33 Withers Street, Albert Park RT Edgar - Albert Park None None 1 2 None Contact agent House Sold on 27 May 2017 Albert Park 2019-01-05 17:27:00.503176
5531 11 CAROLINE STREET, Alfredton The Estate Agent: Ballarat Pty Ltd - Ballarat None None 2 3 4 Contact agent House Sold on 14 Jun 2012 Alfredton 2019-01-05 17:28:03.852237
5609 34 BEAUFORT AVENUE, Alfredton The Estate Agent: Ballarat Pty Ltd - Ballarat None None 1 3 None Contact agent House Sold on 15 Feb 2014 Alfredton 2019-01-05 17:28:06.698475
5717 6 VICTORY AVENUE, Alfredton The Estate Agent: Ballarat Pty Ltd - Ballarat Vaughan King Agent: 2 3 None $330,000 House Sold on 24 Oct 2011 Alfredton 2019-01-05 17:28:11.978445
6005 112 ALFREDTON DRIVE, Alfredton The Estate Agent: Ballarat Pty Ltd - Ballarat None None 2 4 2 Contact agent House Sold on 28 Feb 2013 Alfredton 2019-01-05 17:28:22.364752
6670 7/45 Broomfield Avenue, Alphington Woodards Northern - Carlton Jason Sharpe Agent: 1 1 1 $203,000 Apartment Sold on 30 Jun 2008 Alphington 2019-01-05 17:29:01.306278
6849 Address available on request, Alphington Glenvill Pty Ltd - ALPHINGTON Jess Smith Agent: 2 2 1 $660,000 Apartment Sold on 06 Aug 2018 Alphington 2019-01-05 17:29:07.648960
6926 Address available on request, Alphington Glenvill Pty Ltd - ALPHINGTON Malinda Martin Agent: 2 2 1 $830,000 Apartment Sold on 06 Aug 2018 Alphington 2019-01-05 17:29:10.726436
7146 Address available on request, Alphington Glenvill Pty Ltd - ALPHINGTON Malinda Martin Agent: 2 3 2 $1,475,000 Apartment Sold on 06 Aug 2018 Alphington 2019-01-05 17:29:18.561604
9304 10 Neyland Court, Altona Meadows First National Westwood - Werribee None None 2 3 None Contact agent House Sold on 29 Jul 2011 Altona Meadows 2019-01-05 17:30:36.694859
9357 1 Brennan Court, Altona Meadows Hunter French Real Estate - Altona Meadows MICHAEL TSIGERIDIS Agent: 2 4 2 $345,000 House Sold on 16 Jun 2008 Altona Meadows 2019-01-05 17:30:39.134671
9622 50 Hook Street, Altona Meadows First National Westwood - Werribee None None 2 4 2 Contact agent House Sold on 30 Oct 2009 Altona Meadows 2019-01-05 17:30:46.986372
10259 8 Hakea Court, Altona Meadows First National Westwood - Werribee None None 2 4 4 Contact agent House Sold on 27 Apr 2011 Altona Meadows 2019-01-05 17:31:07.359406
10591 Address available on request, Altona Meadows Sweeney - ALTONA Julie Burt None 2 4 3 $645,000 House Sold on 23 Oct 2017 Altona Meadows 2019-01-05 17:31:20.870065
10678 6 Ward Court, Altona Meadows Hunter French Real Estate - Altona Meadows None None 2 4 4 $840,000 House Sold on 27 Sep 2017 Altona Meadows 2019-01-05 17:31:24.455185
10706 1-5/39 Fitzpatrick Drive, Altona Meadows Hunter French - Altona North None None 9 13 5 $2,410,000 Townhouse Sold on 02 Oct 2017 Altona Meadows 2019-01-05 17:31:27.066375
10925 2/86 Marion Street, Altona North hockingstuart - Williamstown/Altona None None 1 3 3 $415,000 House Sold on 23 Jun 2014 Altona North 2019-01-05 17:31:38.242217
... ... ... ... ... ... ... ... ... ... ... ... ...
880439 221-223 Station Road, Melton Alexkarbon Real Estate - North Melbourne James Rapita None None None None $620,000 Residential Land Sold on 08 May 2017 melton,+vic+3337 2019-01-06 12:50:31.605007
880440 65 Killarney Drive, Melton Professionals Ryder Real Estate - Melton None None 2 4 2 $635,000 House Sold on 07 Jan 2014 melton,+vic+3337 2019-01-06 12:50:31.607020
880441 17 Gloaming Ride, Melton Sweeney Estate Agents - Melton David How Agent: 2 4 4 $659,000 House Sold on 04 Feb 2013 melton,+vic+3337 2019-01-06 12:50:31.609015
880442 27 Carina Drive, Melton hockingstuart - MELTON Jesse Singh None 2 4 2 $660,000 House Sold on 01 Aug 2017 melton,+vic+3337 2019-01-06 12:50:31.612001
880443 46 Unitt Street, Melton hockingstuart - MELTON Damien Spiteri Agent: 2 4 2 $670,000 House Sold on 31 Oct 2017 melton,+vic+3337 2019-01-06 12:50:31.614006
880444 46 Unitt Street, Melton hockingstuart - MELTON Damien Spiteri None 2 4 2 $670,000 House Sold on 31 Oct 2017 melton,+vic+3337 2019-01-06 12:50:31.615999
880445 6-8 Marina Drive, Melton Professionals Ryder Real Estate - Melton Kirsteen Ryder None 3 6 4 $675,000 House Sold on 16 Jan 2018 melton,+vic+3337 2019-01-06 12:50:31.617992
880446 3 Old Park Drive, Melton Ray White - Melton None None 2 4 6 $690,000 House Sold on 05 Dec 2012 melton,+vic+3337 2019-01-06 12:50:31.619986
880447 17 Joan Street, Melton Reliance Real Estate Melton - MELTON Jimmy Gill None 1 4 3 $700,000 House Sold on 15 May 2017 melton,+vic+3337 2019-01-06 12:50:31.622978
880448 8 Joan Street, Melton Reliance Real Estate Melton - MELTON Shubham Rana None 3 5 2 $700,000 House Sold on 20 Mar 2017 melton,+vic+3337 2019-01-06 12:50:31.624973
880449 Address available on request, Melton Professionals Ryder Real Estate - Melton None None 3 5 4 Contact agent House Sold on 29 Oct 2009 melton,+vic+3337 2019-01-06 12:50:31.634945
880450 4 Pinkerton Street, Melton hockingstuart - MELTON None None 2 4 2 Contact agent House Sold on 09 Mar 2017 melton,+vic+3337 2019-01-06 12:50:31.636944
880451 5 McBurnie Drive, Melton None None None 2 4 3 Contact agent House Sold on 24 Sep 2010 melton,+vic+3337 2019-01-06 12:50:31.638935
880452 16 Joan Street, Melton PRDnationwide - Melton None None 4 5 4 Contact agent House Sold on 14 Nov 2014 melton,+vic+3337 2019-01-06 12:50:31.640900
880453 Address available on request, Melton Raine & Horne - Melton None None 2 4 2 Contact agent House Sold on 06 Aug 2009 melton,+vic+3337 2019-01-06 12:50:31.643922
880454 103 Porteous Road, Melton Professionals Ryder Real Estate - Melton None None 2 3 4 Contact agent House Sold on 08 Nov 2010 melton,+vic+3337 2019-01-06 12:50:31.645920
880455 Address available on request, Melton Raine & Horne - Melton None None 2 5 5 Contact agent House Sold on 10 Dec 2010 melton,+vic+3337 2019-01-06 12:50:31.647886
880456 21 Killarney Drive, Melton None None None 3 5 4 Contact agent House Sold on 28 Mar 2012 melton,+vic+3337 2019-01-06 12:50:31.649902
880457 6 Joan Street, Melton Reliance Real Estate Melton - MELTON None None 2 4 2 Contact agent House Sold on 27 Mar 2017 melton,+vic+3337 2019-01-06 12:50:31.651895
880458 519 & 521 High Street, Melton First National Melton - MELTON Daniel Webber Agent: 1 3 None $850,000 House Sold on 18 Jan 2017 melton,+vic+3337 2019-01-06 12:50:32.461815
880459 27 Killarney Drive, Melton First National Melton - MELTON Daniel Webber None 2 4 8 $880,000 House Sold on 03 Aug 2017 melton,+vic+3337 2019-01-06 12:50:32.463810
880460 Address available on request, Melton Raine & Horne - Melton None None 2 5 3 Contact agent House Sold on 15 Jun 2012 melton,+vic+3337 2019-01-06 12:50:32.469787
880461 233 Station Road, Melton Reliance Real Estate Melton - MELTON Jimmy Gill None 1 3 2 $1,090,000 House Sold on 02 May 2018 melton,+vic+3337 2019-01-06 12:50:33.629504
880462 11 KILLARNEY DRIVE, Melton Reliance Real Estate Melton - MELTON Jimmy Gill None 2 3 2 $1,100,000 House Sold on 16 Feb 2018 melton,+vic+3337 2019-01-06 12:50:33.631498
880463 1990-2014 Melton Highway, Melton Sweeney Estate Agents - Melton Garry Gale Agent: 2 3 6 $1,300,000 House Sold on 04 Jan 2013 melton,+vic+3337 2019-01-06 12:50:33.633494
880464 1480-1582 Gisborne Melton Road, Melton YPA Melton Shane Spiteri Agent: 2 4 4 $1,860,000 House Sold on 01 Apr 2011 melton,+vic+3337 2019-01-06 12:50:33.635489
880465 305-329 Ferris Road, Melton Sweeney Estate Agents - Melton Garry Gale Agent: None None None $1,900,000 Other Sold on 13 Nov 2014 melton,+vic+3337 2019-01-06 12:50:33.637482
880466 Lot 1, 48-66 Highett Road, Melton Barry Plant - Melton John McCann Agent: None None None $2,250,000 Residential Land Sold on 10 Jan 2018 melton,+vic+3337 2019-01-06 12:50:33.639478
880467 Corner Ryans Lane & Minns Road, Melton First National Melton - MELTON Daniel Webber None 2 4 2 $2,350,000 House Sold on 22 Sep 2017 melton,+vic+3337 2019-01-06 12:50:33.641472
880468 61 Finchs Road, Melton None None None 1 3 2 Contact agent House Sold on 22 Aug 2011 melton,+vic+3337 2019-01-06 12:50:33.648460

148242 rows × 12 columns

In [12]:
df[df.address[9357] == df.address]
Out[12]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
9343 1 Brennan Court, Altona Meadows None None None 2 4 2 $345,000 House Sold on 16 Jun 2008 Altona Meadows 2019-01-05 17:30:38.401642
9357 1 Brennan Court, Altona Meadows Hunter French Real Estate - Altona Meadows MICHAEL TSIGERIDIS Agent: 2 4 2 $345,000 House Sold on 16 Jun 2008 Altona Meadows 2019-01-05 17:30:39.134671
10464 1 Brennan Court, Altona Meadows Sweeney - ALTONA Julie Burt Agent: 2 4 4 $585,000 House Sold on 09 Mar 2017 Altona Meadows 2019-01-05 17:31:16.778542
In [13]:
df.agent_title.value_counts()
Out[13]:
None      654379
Agent:    226090
Name: agent_title, dtype: int64
In [14]:
df.price.head()
Out[14]:
0    $270,000
1    $299,000
2    $300,000
3    $300,000
4    $300,000
Name: price, dtype: object
In [15]:
df.address.value_counts()[:20]
Out[15]:
Address available on request, Wonthaggi           1245
Address available on request, Bacchus Marsh        578
Address available on request, Warrnambool          534
Address available on request, Cranbourne           476
Address available on request, Epping               468
Address available on request, Wangaratta           415
Address available on request, Hoppers Crossing     391
Address available on request, Boronia              358
Address available on request, Werribee             338
Address available on request, Shepparton           336
Address available on request, Inverloch            334
Address available on request, Frankston            323
Address available on request, Wodonga              315
Address available on request, Mount Martha         306
Address available on request, Tarneit              299
Address available on request, South Morang         294
Address available on request, Montrose             293
Address available on request, Croydon              291
Address available on request, Rosebud              280
Address available on request, Paynesville          261
Name: address, dtype: int64
In [16]:
df.iloc[:,:10].duplicated().sum()
Out[16]:
144232
In [17]:
df[['address', 'sold_date']].duplicated().sum()
Out[17]:
148242

Tidiness Issues

  1. sold_date column has unnecessary string and is not date format.
  2. suburb value in suburb column is sometimes different than the one in the address column.
  3. agency name and agency suburb are in the same column.
  4. agent_title is either None or Agent, and also time column is unnecessary.
  5. columns beds, baths, cars and price are strings not integers.

Quality Issues

  1. There are many duplicate rows.
  2. Some addresses are not mentioned and it just says "Address available on request".
  3. There are a large number of rows with no address.
  4. There are some outliers in the dataset.

Cleaning

In [18]:
clean = df.copy()

Fixing sold_date column to standard date format

I will drop the rows without a sold date and then change the rest of them into datatime format.

In [19]:
clean.drop(clean[clean.sold_date.isnull()].index,axis=0, inplace=True)
In [20]:
clean.sold_date = pd.to_datetime(clean.sold_date.apply(lambda x : x.split('on ')[1:][0]))
In [21]:
clean.head()
Out[21]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
0 2/5-7 Princes Street, Abbotsford Collins Simms - Inner North None None 1 1 1 $270,000 Apartment 2015-05-30 Abbotsford 2019-01-05 17:24:35.774257
1 310A/11 Flockhart St, Abbotsford Ray White - Ringwood None None 1 1 1 $299,000 Apartment 2017-09-06 Abbotsford 2019-01-05 17:24:35.776254
2 704/20 Shamrock Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 None $300,000 Apartment 2017-09-08 Abbotsford 2019-01-05 17:24:35.778246
3 6/241 Nicholson Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 1 $300,000 Apartment 2016-10-08 Abbotsford 2019-01-05 17:24:35.780241
4 10/20 Valiant Street, Abbotsford LJ Hooker - Boronia Julien Karolos Agent: 1 1 1 $300,000 Apartment 2010-06-05 Abbotsford 2019-01-05 17:24:35.782235
In [22]:
clean.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 880061 entries, 0 to 880468
Data columns (total 12 columns):
address          880061 non-null object
agency           880061 non-null object
agent_name       880061 non-null object
agent_title      880061 non-null object
baths            880061 non-null object
beds             880061 non-null object
cars             880061 non-null object
price            880061 non-null object
property_type    880061 non-null object
sold_date        880061 non-null datetime64[ns]
suburb           880061 non-null object
time             880061 non-null object
dtypes: datetime64[ns](1), object(11)
memory usage: 87.3+ MB

Fixing suburb name in the suburb column

The values in the suburb column come from the searched suburb name in the scraping process. Some suburb names are greater regions which contain other suburbs in the search results. To fix this I will extract the suburb name from the address column and replace the suburb value with it.

In [23]:
clean.suburb = clean.address.apply(lambda x : x.split(', ')[-1])
In [24]:
clean.head()
Out[24]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
0 2/5-7 Princes Street, Abbotsford Collins Simms - Inner North None None 1 1 1 $270,000 Apartment 2015-05-30 Abbotsford 2019-01-05 17:24:35.774257
1 310A/11 Flockhart St, Abbotsford Ray White - Ringwood None None 1 1 1 $299,000 Apartment 2017-09-06 Abbotsford 2019-01-05 17:24:35.776254
2 704/20 Shamrock Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 None $300,000 Apartment 2017-09-08 Abbotsford 2019-01-05 17:24:35.778246
3 6/241 Nicholson Street, Abbotsford Biggin & Scott - Richmond Emily Sayers None 1 1 1 $300,000 Apartment 2016-10-08 Abbotsford 2019-01-05 17:24:35.780241
4 10/20 Valiant Street, Abbotsford LJ Hooker - Boronia Julien Karolos Agent: 1 1 1 $300,000 Apartment 2010-06-05 Abbotsford 2019-01-05 17:24:35.782235

Fixing agency name

Agency names combine the name of the real estate agency and the branch's suburb, I'll extract the agency name from the string.

In [25]:
clean['agency'] = clean.agency.apply(lambda x : x.split(' - ')[0])
In [26]:
clean.head()
Out[26]:
address agency agent_name agent_title baths beds cars price property_type sold_date suburb time
0 2/5-7 Princes Street, Abbotsford Collins Simms None None 1 1 1 $270,000 Apartment 2015-05-30 Abbotsford 2019-01-05 17:24:35.774257
1 310A/11 Flockhart St, Abbotsford Ray White None None 1 1 1 $299,000 Apartment 2017-09-06 Abbotsford 2019-01-05 17:24:35.776254
2 704/20 Shamrock Street, Abbotsford Biggin & Scott Emily Sayers None 1 1 None $300,000 Apartment 2017-09-08 Abbotsford 2019-01-05 17:24:35.778246
3 6/241 Nicholson Street, Abbotsford Biggin & Scott Emily Sayers None 1 1 1 $300,000 Apartment 2016-10-08 Abbotsford 2019-01-05 17:24:35.780241
4 10/20 Valiant Street, Abbotsford LJ Hooker Julien Karolos Agent: 1 1 1 $300,000 Apartment 2010-06-05 Abbotsford 2019-01-05 17:24:35.782235

Dropping agent_title and time columns

It seems agency_title columns doesn't present any valuable information. I'll drop this column from the dataset.

In [27]:
clean.drop(['agent_title','time'],axis=1,inplace=True)
In [28]:
clean.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 880061 entries, 0 to 880468
Data columns (total 10 columns):
address          880061 non-null object
agency           880061 non-null object
agent_name       880061 non-null object
baths            880061 non-null object
beds             880061 non-null object
cars             880061 non-null object
price            880061 non-null object
property_type    880061 non-null object
sold_date        880061 non-null datetime64[ns]
suburb           880061 non-null object
dtypes: datetime64[ns](1), object(9)
memory usage: 73.9+ MB

Changing beds, baths, cars and price columns to integer

The columns beds, baths, cars and price are extracted in string format, to be able to do analysis and calculations on these numbers I'll transform them into integers and set the rows with no value to 0.

In [29]:
clean.beds = clean.beds.apply(lambda x : x.replace(' ',''))
In [30]:
clean.baths = clean.baths.apply(lambda x : x.replace(' ',''))
In [31]:
clean.cars = clean.cars.apply(lambda x : x.replace(' ',''))
In [32]:
clean.beds = clean.beds.apply(lambda x : int(x) if x!='None' else 0)
In [33]:
clean.baths = clean.baths.apply(lambda x : int(x) if x!='None' else 0)
In [34]:
clean.cars = clean.cars.apply(lambda x : int(x) if x!='None' else 0)
In [35]:
clean.price = clean.price.apply(lambda x: x.replace('$',''))
In [36]:
clean.price = clean.price.apply(lambda x :x.replace(',',''))
In [37]:
clean.price = clean.price.apply(lambda x : 0 if x=='Contact agent' else int(x))
In [38]:
clean.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 880061 entries, 0 to 880468
Data columns (total 10 columns):
address          880061 non-null object
agency           880061 non-null object
agent_name       880061 non-null object
baths            880061 non-null int64
beds             880061 non-null int64
cars             880061 non-null int64
price            880061 non-null int64
property_type    880061 non-null object
sold_date        880061 non-null datetime64[ns]
suburb           880061 non-null object
dtypes: datetime64[ns](1), int64(4), object(5)
memory usage: 73.9+ MB
In [39]:
clean.describe()
Out[39]:
baths beds cars price
count 880061.000000 880061.000000 880061.000000 8.800610e+05
mean 1.487812 2.880097 1.713451 4.194425e+05
std 1.574466 1.213675 18.063384 1.472575e+07
min 0.000000 0.000000 0.000000 0.000000e+00
25% 1.000000 2.000000 1.000000 0.000000e+00
50% 1.000000 3.000000 2.000000 2.750000e+05
75% 2.000000 4.000000 2.000000 5.100000e+05
max 1300.000000 37.000000 11951.000000 4.294967e+09

Fixing rows without an address

Some rows do not have a valid address, I'll drop these rows from the dataset.

In [40]:
clean[clean.address.apply(lambda x : 'Address available' in x)].count()
Out[40]:
address          28444
agency           28444
agent_name       28444
baths            28444
beds             28444
cars             28444
price            28444
property_type    28444
sold_date        28444
suburb           28444
dtype: int64
In [41]:
clean.drop(clean[clean.address.apply(lambda x : 'Address available' in x)].index,axis= 0, inplace=True)
In [42]:
clean.address.value_counts()[:10]
Out[42]:
132-134 Maroondah Highway, Mooroolbark    19
7835 Goulburn Valley Highway, Kialla      18
1268 Mountain Highway, The Basin          17
10 Rex Street, Paynesville                16
7 Scott Court, Mirboo North               15
72 Edols Street, Ballan                   13
81 Facey Drive, Tolmie                    12
Kelpie Boulevard, Curlewis                12
109 Hastings Road, Greendale              12
301/96 The Avenue, Mount Buller           12
Name: address, dtype: int64

Fixing the outliers

Now that the dataset is cleaner I can do some basic assessment on outliers. I'll visually check the strange rows and random check the web page allocated to them on the realestate.com.au.

In [43]:
clean[clean.beds > 10]
Out[43]:
address agency agent_name baths beds cars price property_type sold_date suburb
4902 36 Villeneuve Street, Alexandra Landmark Harcourts None 2 20 3 0 House 2010-04-08 Alexandra
10705 1-5/39 Fitzpatrick Drive, Altona Meadows Hunter French Real Estate None 9 13 5 2410000 Townhouse 2017-10-02 Altona Meadows
10706 1-5/39 Fitzpatrick Drive, Altona Meadows Hunter French None 9 13 5 2410000 Townhouse 2017-10-02 Altona Meadows
13013 164 - 170 Great Ocean Road, Anglesea Great Ocean Road Real Estate Kellie Saddington 11 20 14 1875000 House 2014-11-01 Anglesea
13738 6080 Great Ocean Road, Apollo Bay Castran Real Estate John Castran 20 20 0 2350000 House 2013-09-10 Apollo Bay
17617 527 Orrong Road, Armadale Biggin & Scott None 5 13 4 0 House 2016-05-06 Armadale
17653 506 Orrong Road, Armadale Jellis Craig None 8 14 10 0 House 2009-04-30 Armadale
20603 470-472 Warrigal Road, Ashburton Frederick Property Daniel Chu 4 12 4 2300000 House 2016-10-16 Ashburton
22386 8 Ross Street, Aspendale Barry Plant Jeremiah Siemianow 8 11 8 1350000 House 2017-12-20 Aspendale
25480 'Kurrajong' Mayday Hills, Beechworth First National Real Estate Tony Stockdale 3 12 0 450000 House 2016-01-18 Beechworth
25481 'Carinya' Mayday Hills, Beechworth First National Real Estate Tony Stockdale 2 11 0 450000 House 2015-12-23 Beechworth
35042 Fraser Island, Lakes Entrance Jellis Craig None 5 11 0 3000000 House 2010-03-24 Lakes Entrance
43939 187 Scott Parade, Ballarat East hockingstuart None 8 13 6 0 House 2011-09-26 Ballarat East
44042 710 Sturt Street, Ballarat Central Harcourts None 3 11 8 1530000 House 2014-08-16 Ballarat Central
45101 710 Sturt Street, Ballarat Central Harcourts None 3 11 8 1530000 House 2014-08-16 Ballarat Central
46092 187 Scott Parade, Ballarat East hockingstuart None 8 13 6 0 House 2011-09-26 Ballarat East
54712 11 Hopetoun Street, Dandenong iSell Group None 2 13 0 0 House 2009-04-08 Dandenong
54819 11 Hopetpun Street, Dandenong Steadfast Real Estate None 3 13 5 1000000 House 2018-06-19 Dandenong
54852 65 Pultney Street, Dandenong McLennan Real Estate P/L None 6 11 2 0 House 2015-11-19 Dandenong
54855 5 Herbert Street, Dandenong Ray White Ben Jusufi 16 16 16 3620000 Block Of Units 2018-05-02 Dandenong
63122 'Kurrajong' Mayday Hills, Beechworth First National Real Estate Tony Stockdale 3 12 0 450000 House 2016-01-18 Beechworth
63123 'Carinya' Mayday Hills, Beechworth First National Real Estate Tony Stockdale 2 11 0 450000 House 2015-12-23 Beechworth
65025 1-8/14-16 Wolseley Grove, Bell Post Hill Harcourts Joe Grgic 8 11 11 130000 Block Of Units 2015-01-09 Bell Post Hill
75031 10 Queen Street, Queenscliff Rendina Real Estate None 2 15 6 0 House 2012-01-20 Queenscliff
78307 152-154 Roslyn Road, Belmont McGrath Jim Cross 5 12 1 1365000 House 2013-11-09 Belmont
87090 80 High Street, Kangaroo Flat Elders Real Estate None 6 11 0 0 House 2014-11-20 Kangaroo Flat
87277 32 Forest Street, Bendigo Bendigo Real Estate Damien O'Shannessy 3 14 0 1200000 House 2014-09-23 Bendigo
87282 32 Forest Street, Bendigo PRDnationwide Sacha Dale 3 14 0 1300000 House 2018-02-21 Bendigo
92586 176 East Boundary Road, Bentleigh East LLC REAL ESTATE Eric Li 5 12 3 1860000 House 2017-08-19 Bentleigh East
108301 378 Station Street, Bonbeach One Agency Longbeach None 12 12 8 0 Apartment 2014-07-04 Bonbeach
... ... ... ... ... ... ... ... ... ... ...
748750 4 Charles Street, St Kilda Ray White Oakleigh None 15 23 11 2200000 House 2016-04-11 St Kilda
748790 1-9/17a Burnett Street, St Kilda Pride Real Estate Tony Pride 9 15 7 3850000 Block Of Units 2018-10-05 St Kilda
751083 105 Westbury Street, St Kilda East McGrath Michael Townsend 5 11 4 1360000 Block Of Units 2014-10-29 St Kilda East
753985 60 Napier Street, St Arnaud Landmark Harcourts Tony Driscoll 4 14 0 165000 Villa 2014-03-24 St Arnaud
754404 95-101 Napier Street, St Arnaud Fletchers Larry Callaghan 5 11 0 272000 House 2017-05-11 St Arnaud
763386 1-8/159 O'shanassy Street, Sunbury L.J. Whorlow First National Shantelle Cardwell-Smith 8 16 8 1968000 Block Of Units 2017-07-26 Sunbury
765341 13 Ridley Street, Sunshine Create Real Estate Brenda Ngan 12 20 12 2000000 Apartment 2015-04-09 Sunshine
765342 1-12/113 Devonshire Road, Sunshine Douglas Kay Real Estate Doug Kay 12 12 12 2090000 Block Of Units 2018-12-20 Sunshine
770165 1-8/404 Whitehorse Road, Surrey Hills Woodards Karen Chung 8 16 8 4000000 Block Of Units 2018-05-03 Surrey Hills
771476 36 Gray Street, Swan Hill LJ Hooker None 11 11 0 401500 House 2015-10-31 Swan Hill
773551 901 McLeod Road, French Island Century 21 Home Port Phil Bock 15 30 20 3999999 House 2017-01-05 French Island
797113 31 The Esplanade, Torquay Purplebricks None 4 12 5 3495000 Block Of Units 2017-07-04 Torquay
802042 1-6/153 Buckley Street, Morwell Hall & Partners First National Michael Cervenjak 6 12 6 490000 Block Of Units 2017-10-20 Morwell
802275 1-6/17 Gwalia Street, Traralgon Stockdale & Leggo Peter Demetrios 6 12 6 622000 Unit 2017-11-10 Traralgon
806974 311 Ulupna Bridge Road, Ulupna None None 12 14 17 0 House 2018-02-23 Ulupna
814974 22-24 Glen Street, Walpeup Burns & Co. Ian Miers 5 11 10 165000 House 2011-12-12 Walpeup
819650 544 - 548 BORONIA ROAD, Wantirna Eview Group None 5 12 6 2500000 House 2016-01-14 Wantirna
830715 177 Watsonia Road, Watsonia Nelson Alexander None 6 12 6 0 House 2015-07-25 Watsonia
836539 635 Wensleydale Station Road, Wensleydale Great Ocean Road Real Estate Ian Stewart 15 29 12 1200000 House 2016-12-09 Wensleydale
851257 54 The Avenue, Windsor Jellis Craig & Company Pty Ltd None 4 20 0 1950000 House 2010-07-02 Windsor
851263 13 Lewisham Road, Windsor Castran Gilbert Tim Brown 8 16 5 3200000 Block Of Units 2015-09-10 Windsor
865187 36 Leslea Court, Yanakie None None 7 12 2 0 Other 2017-12-16 Yanakie
865555 939 Melba Highway, Yarra Glen Integrity Real Estate (Yarra Valley) Pty Ltd None 10 12 0 0 House 2014-04-04 Yarra Glen
868520 54 Pentland Parade, Yarraville McGrath None 2 12 2 0 House 2013-07-25 Yarraville
869783 11 Hogans Road, Yarrawonga Extons Real Estate Stephenie Exton 9 17 11 985000 House 2018-12-20 Yarrawonga
869945 23 Raglan Street, Yea Ruralco Property None 1 23 3 0 House 2011-03-25 Yea
875915 1-6/72 Bellerine Street, Geelong Hocking Stuart Carl McCann 6 12 6 1950000 Block Of Units 2018-11-17 Geelong
877440 32 Forest Street, Bendigo Bendigo Real Estate Damien O'Shannessy 3 14 0 1200000 House 2014-09-23 Bendigo
877441 32 Forest Street, Bendigo PRDnationwide Sacha Dale 3 14 0 1300000 House 2018-02-21 Bendigo
878299 1-6/72 Bellerine Street, Geelong Hocking Stuart Carl McCann 6 12 6 1950000 Block Of Units 2018-11-17 Geelong

223 rows × 10 columns

It appears that some property listings have large numbers of bedrooms, bathrooms and car parks that are not actually real.
In some other cases the property is a Block of Units and the numbers are associated with the total number of bed, bath, car in all units not in each individual unit.
I think property_type is a good measurment to decide whether these values are real or not.
For the purpose of this analysis which is to analyze the general property market in the state of Victoria, Australia, I'm going to analyze the dataset mainly using the common property types such as House, Townhouse, Unit and Apartment.

In [44]:
clean[clean.price > 10000000]
Out[44]:
address agency agent_name baths beds cars price property_type sold_date suburb
10709 4 O'Brien Court, Altona Meadows Sweeney Peter Seitanidis 1 4 1 2147483647 House 2012-09-13 Altona Meadows
30373 11 Osborne Street, Bacchus Marsh First National Rayner Graeme Rayner 1 3 0 123456789 House 2011-05-26 Bacchus Marsh
30374 00 Dicksons Road, Bacchus Marsh John Kontek Geoff Taylor 1 2 10 165000000 Acreage 2017-12-06 Bacchus Marsh
75371 Banks Road/Ocean Grand Drive, Ocean Grove Hocking Stuart Carl McCann 0 0 0 11100000 Residential Land 2017-05-24 Ocean Grove
113311 11-13 Irving Avenue, Box Hill Buxton Jim Chen 3 6 4 12200000 House 2017-11-24 Box Hill
134543 21 Elsie Mews, Brunswick East None None 3 3 1 2147483647 Townhouse 2008-12-24 Brunswick East
142274 12 Akoonah Court, Burnside YPA Caroline Springs None 2 3 1 2147483647 House 2008-09-26 Burnside
145826 4385 South Gippsland Highway, Caldermeade Alex Scott & Staff None 1 3 0 4294967295 Dairy 2018-05-21 Caldermeade
173996 14A & 14B Douglas Avenue, Chelsea Eview Group None 3 3 1 1915000000 House 2017-10-28 Chelsea
191081 39 Bishop Street, Coburg Harcourts Roxburgh Park None 1 3 0 2147483647 House 2011-08-08 Coburg
203004 4-6 VON MUELLER WAY, Cowes Alex Scott & Staff Greg Price 1 3 0 102500000 House 2016-03-16 Cowes
246963 1713/100 Harbour Esplanade, Docklands None None 1 1 1 2147483647 Apartment 2009-11-15 Docklands
252558 96-98 Deep Creek Drive, Doncaster East Barry Plant None 0 0 0 375000550 Residential Land 2009-12-15 Doncaster East
252559 3 Callistemon Court, Doncaster East Ray White Mehron Mashayekh 0 0 0 1111111111 Residential Land 2009-12-14 Doncaster East
262412 1 Fairchild Street, Drouin Peter Williams Real Estate None 1 3 2 2147483647 House 2011-04-08 Drouin
267067 8 & 28/462 Victoria Parade, East Melbourne Nelson Alexander Tom Roberts 1 1 0 10750000 Apartment 2018-12-19 East Melbourne
270623 1 Cobb Haven, Cobb Highway, Moama Charles L. King & Co. First National Wayne Norwood 1 3 1 12300000 House 2015-09-23 Moama
295114 630 Eynesbury Road, Eynesbury YPA Melton Mark Edwards 3 4 2 31082012 House 2012-09-11 Eynesbury
315716 9 Oaklands Crescent, Frankston OBrien Real Estate Stavros Ambatzidis 1 3 1 35700000 House 2014-09-13 Frankston
315717 3/44 Petrie Street, Frankston Stockdale & Leggo None 1 2 1 2147483647 Acreage 2010-04-22 Frankston
315718 4 Nowa Court, Frankston Stockdale & Leggo None 1 3 2 2147483647 House 2010-04-16 Frankston
315719 17 Brighton Street, Frankston Stockdale & Leggo None 2 4 0 2147483647 House 2010-03-09 Frankston
315720 9 Madeira Court, Frankston Stockdale & Leggo None 1 3 2 2147483647 House 2010-03-09 Frankston
315721 1 Gordon Avenue, Frankston Stockdale & Leggo None 2 4 0 2147483647 Acreage 2010-03-06 Frankston
315722 3 Madeira Court, Frankston Stockdale & Leggo None 1 3 2 2147483647 House 2010-02-26 Frankston
315723 42 Golconda, Frankston Stockdale & Leggo None 1 3 0 2147483647 House 2010-02-21 Frankston
315724 5/152 Skye Road, Frankston Stockdale & Leggo None 1 3 1 2147483647 Unit 2010-02-19 Frankston
315725 21 Isabella Crescent, Frankston Stockdale & Leggo None 1 3 1 2147483647 House 2010-02-18 Frankston
315726 3/4-6 Royle Street, Frankston Stockdale & Leggo None 1 2 1 2147483647 Unit 2010-02-18 Frankston
315727 163 Heatherhill Road, Frankston Stockdale & Leggo None 2 3 2 2147483647 House 2010-02-14 Frankston
... ... ... ... ... ... ... ... ... ... ...
316772 57 Forrest Drive, Frankston North Stockdale & Leggo None 1 3 0 2147483647 House 2010-02-08 Frankston North
316773 59 Forest Drive, Frankston North Stockdale & Leggo None 1 3 0 2147483647 House 2010-01-21 Frankston North
319899 27 Plummer Avenue, Frankston South Stockdale & Leggo None 2 4 2 2147483647 House 2010-05-02 Frankston South
319900 2/19-21 Jasper Terrace, Frankston South Stockdale & Leggo None 2 2 1 2147483647 Unit 2010-02-23 Frankston South
333276 Banks Road/Ocean Grand Drive, Ocean Grove Hocking Stuart Carl McCann 0 0 0 11100000 Residential Land 2017-05-24 Ocean Grove
358367 4-6 VON MUELLER WAY, Cowes Alex Scott & Staff Greg Price 1 3 0 102500000 House 2016-03-16 Cowes
439142 4385 South Gippsland Highway, Caldermeade Alex Scott & Staff None 1 3 0 4294967295 Dairy 2018-05-21 Caldermeade
502964 1302/620 Collins Street, Melbourne None None 1 2 1 2147483647 Apartment 2009-08-28 Melbourne
513359 630 Eynesbury Road, Eynesbury YPA Melton Mark Edwards 3 4 2 31082012 House 2012-09-11 Eynesbury
513360 12 Akoonah Court, Burnside YPA Caroline Springs None 2 3 1 2147483647 House 2008-09-26 Burnside
524776 312 Beaconsfield Parade, Middle Park Greg Hocking Holdsworth Greg Hocking 0 0 0 11810000 Residential Land 2015-12-15 Middle Park
548497 11 Osborne Street, Bacchus Marsh First National Rayner Graeme Rayner 1 3 0 123456789 House 2011-05-26 Bacchus Marsh
548498 00 Dicksons Road, Bacchus Marsh John Kontek Geoff Taylor 1 2 10 165000000 Acreage 2017-12-06 Bacchus Marsh
628919 Banks Road/Ocean Grand Drive, Ocean Grove Hocking Stuart Carl McCann 0 0 0 11100000 Residential Land 2017-05-24 Ocean Grove
641297 18 Keiller Avenue, Parkdale Schroeder & Wallis Billy Schroeder 1 3 2 1010000000 House 2016-08-27 Parkdale
646432 18 Pier One Drive, Patterson Lakes Asset Property Sales None 3 4 4 11500000 House 2016-03-03 Patterson Lakes
681457 154-166 Maroondah Highway, Ringwood Jellis Craig William Lyall 1 1 0 11130000 Other 2018-09-04 Ringwood
712404 2/199 Nepean Hwy, Seaford Stockdale & Leggo None 2 3 2 2147483647 Townhouse 2010-04-21 Seaford
720130 3/4 Erskine street, Shepparton Stockdale & Leggo None 1 2 1 2147483647 Unit 2010-06-16 Shepparton
738968 6 NEALE STREET, Springvale LJ Hooker Joseph Nguyen 1 3 3 2147483647 House 2014-04-28 Springvale
748801 6 Tennyson St & 1 Bundalohn Court, St Kilda Teska & Carson Larry Takis 0 0 0 10100000 Residential Land 2016-09-02 St Kilda
770167 9 Loch Street, Surrey Hills RT Edgar Glen Coutinho 2 5 1 123456789 House 2013-06-29 Surrey Hills
778875 1160 Sayers Road, Tarneit First National Westwood Bob Westwood 0 0 0 27000000 Residential Land 2009-09-24 Tarneit
788777 4/86 Heyington Avenue, Thomastown Harcourts Rata & Co Michael Cananzi 1 2 1 28000000 Unit 2016-10-15 Thomastown
793689 12 Lansell Rd, Toorak Weast Corporation James Liu 5 5 0 12500000 House 2014-04-22 Toorak
806318 27/1 Millar Road, Tullamarine Eview Group Raffaele Nicotera 1 2 1 320000000 House 2015-11-17 Tullamarine
806767 50 Delepan Drive, Tyabb None None 2 3 5 2147483647 House 2009-10-15 Tyabb
848198 100 Seventeenth Avenue, Whittlesea None None 3 4 6 11000000 Acreage 2011-09-01 Whittlesea
855034 7 MARSHALL STREET, Wodonga Sell Buy Rent Heidi Bourke 1 3 4 26300000 House 2015-04-22 Wodonga
875073 401/22 Main Street, Mornington McEwing & Partners Quentin McEwing 3 4 2 16000000 Apartment 2012-11-12 Mornington

62 rows × 10 columns

By looking at the top most expensive properties it is obvious that most of the prices are random and not real, I made sure of this by checking some of the properties on the website.
Also some prices accidently have one or two extra 0's.
I will drop the top 0.1% of rows with the highest number of beds, baths, car parks and prices to normalize the dataset among all property_types.

In [45]:
clean.quantile(.999)
Out[45]:
baths          5.0
beds           7.0
cars          11.0
price    3120000.0
Name: 0.999, dtype: float64
In [46]:
clean.drop(clean[(clean.baths>5)].index, axis=0, inplace=True)
In [47]:
clean.drop(clean[(clean.beds>7)].index, axis=0, inplace=True)
In [48]:
clean.drop(clean[(clean.cars>11)].index, axis=0, inplace=True)
In [49]:
clean.drop(clean[(clean.price>3120000)].index, axis=0, inplace=True)
In [50]:
clean.describe()
Out[50]:
baths beds cars price
count 849069.000000 849069.000000 849069.000000 8.490690e+05
mean 1.481300 2.869523 1.670712 3.268801e+05
std 0.726169 1.186869 1.249115 3.745775e+05
min 0.000000 0.000000 0.000000 0.000000e+00
25% 1.000000 2.000000 1.000000 0.000000e+00
50% 1.000000 3.000000 2.000000 2.880000e+05
75% 2.000000 4.000000 2.000000 5.140000e+05
max 5.000000 7.000000 11.000000 3.120000e+06

Making more specific columns for sold_date

To better analyze the dataset, we'll be needing more specific sold_date values such as month, year and month of the year values. Having separate columns for these instead of calculating them everytime in the charts makes life much easier.

In [51]:
clean['year'] = clean.sold_date.apply(lambda x: x.year)
clean['month'] = clean.sold_date.apply(lambda x: x.month)
clean['month_year'] = pd.to_datetime(clean['sold_date']).dt.to_period('M')

Fixing the duplicate rows

And finally I'll try to remove all duplicate rows. In the data gathering process I scraped some specific suburbs twice as I didn't get all properties in the first attempt. Then I merged the datasets together which means there are plenty of duplicate rows.
Beside the rows that I scraped twice, there are rows that are repeated multiple times in the realestate.com.au, these rows are sometimes identical and sometimes some info such as beds, agency or price are different. To recognise these rows I assess the dataset based on the property address and the data it was sold as these 2 values decide whether or not a row is duplicated.

I'll drop the obvious duplicates first.

In [52]:
clean.drop(clean[clean.duplicated()].index,axis=0, inplace=True)
In [53]:
clean[['address', 'sold_date']].duplicated().sum()
Out[53]:
1722

In the table below we can see some of the duplicated rows, some of them have different prices with the exact same description, for some rows the property_type is different and the others are different in the number of beds/baths/cars.

In [54]:
clean[clean['address'].isin(clean['address'][clean[['address', 'sold_date']].duplicated()])].sort_values('sold_date')
Out[54]:
address agency agent_name baths beds cars price property_type sold_date suburb year month month_year
496808 339 Swanston Street, Melbourne None None 1 1 0 165000 Apartment 2006-09-22 Melbourne 2006 9 2006-09
496997 339 Swanston Street, Melbourne None None 1 1 0 195000 Apartment 2006-11-17 Melbourne 2006 11 2006-11
496689 339 Swanston Street, Melbourne None None 1 1 0 136088 Apartment 2007-02-19 Melbourne 2007 2 2007-02
496771 339 Swanston Street, Melbourne None None 1 1 0 159950 Apartment 2007-02-19 Melbourne 2007 2 2007-02
497572 339 Swanston Street, Melbourne None None 1 3 0 277500 Apartment 2007-05-05 Melbourne 2007 5 2007-05
496817 339 Swanston Street, Melbourne None None 1 1 0 166000 Apartment 2007-05-23 Melbourne 2007 5 2007-05
220422 1910 Midland Hwy, Creswick Ballarat Real Estate None 1 1 0 0 Other 2007-06-06 Creswick 2007 6 2007-06
220423 1910 Midland Hwy, Creswick Ballarat Real Estate None 1 1 0 0 House 2007-06-06 Creswick 2007 6 2007-06
37549 9 Briardale Ave, Enfield Ballarat Real Estate None 1 2 0 0 House 2007-06-14 Enfield 2007 6 2007-06
37550 9 Briardale Ave, Enfield Ballarat Real Estate None 1 2 0 0 Other 2007-06-14 Enfield 2007 6 2007-06
60760 15 Pratt Street, Beaufort Ballarat Real Estate None 1 3 0 0 House 2007-06-14 Beaufort 2007 6 2007-06
60759 15 Pratt Street, Beaufort Ballarat Real Estate None 1 3 0 0 Other 2007-06-14 Beaufort 2007 6 2007-06
496810 339 Swanston Street, Melbourne None None 1 1 0 165500 Apartment 2007-07-02 Melbourne 2007 7 2007-07
604601 1/21 Basil Street, Newport Compton Green None 1 3 1 420000 Townhouse 2007-07-13 Newport 2007 7 2007-07
172629 2/11 Scotch Parade, Chelsea Ray White None 1 2 0 0 House 2007-07-20 Chelsea 2007 7 2007-07
172630 2/11 Scotch Parade, Chelsea Ray White None 1 2 1 0 House 2007-07-20 Chelsea 2007 7 2007-07
64282 5 Retreat Road, Belgrave South Peake Real Estate None 3 4 4 1500000 House 2007-09-24 Belgrave South 2007 9 2007-09
64294 5 Retreat Road, Belgrave South Peake Real Estate None 3 4 4 0 Lifestyle 2007-09-24 Belgrave South 2007 9 2007-09
748598 28 Gurner Street, St Kilda Wilson Agents None 2 6 3 0 House 2007-12-01 St Kilda 2007 12 2007-12
748599 28 Gurner Street, St Kilda Gary Peer & Associates None 2 5 3 0 House 2007-12-01 St Kilda 2007 12 2007-12
41210 4 McDougall Drive, Magpie Ballarat Real Estate None 2 4 0 0 Mixed Farming 2007-12-06 Magpie 2007 12 2007-12
41209 4 McDougall Drive, Magpie Ballarat Real Estate None 2 4 0 0 House 2007-12-06 Magpie 2007 12 2007-12
668190 91 Stanleys Road, Red Hill South Jacobs & Lowe Cameron McDonald 3 5 0 1700000 Lifestyle 2008-01-11 Red Hill South 2008 1 2008-01
668191 91 Stanleys Road, Red Hill South Jacobs & Lowe Cameron McDonald 3 5 2 1700000 Acreage 2008-01-11 Red Hill South 2008 1 2008-01
724846 781 Frankston-Flinders Rd, Somerville Jacobs & Lowe Cameron McDonald 2 3 0 860000 Livestock 2008-01-18 Somerville 2008 1 2008-01
724847 781 Frankston-Flinders Rd, Somerville Jacobs & Lowe Cameron McDonald 2 3 2 860000 Acreage 2008-01-18 Somerville 2008 1 2008-01
336348 311 Millett Road, Gisborne South Brad Teal Real Estate Pty Ltd None 3 4 3 545000 Other 2008-02-02 Gisborne South 2008 2 2008-02
472861 18 Alpine Heath Way, Lyndhurst First National Real Estate Reliance None 2 4 2 420000 House 2008-02-21 Lyndhurst 2008 2 2008-02
472862 18 Alpine Heath Way, Lyndhurst First National Real Estate Reliance Sachin Arora 2 4 2 420000 House 2008-02-21 Lyndhurst 2008 2 2008-02
477419 36 Woodlea Court, Woodend Brad Teal Real Estate Pty Ltd None 2 3 2 475000 House 2008-02-29 Woodend 2008 2 2008-02
... ... ... ... ... ... ... ... ... ... ... ... ... ...
24955 135 Phillip Road, Avonsleigh Ranges First National Mick Dolphin 2 5 10 1442000 House 2018-10-11 Avonsleigh 2018 10 2018-10
825436 710 Lardners Track, Warragul West Clark NextRE Anthony Rabl 0 0 0 1835000 Other 2018-10-13 Warragul West 2018 10 2018-10
344702 19/850 Pascoe Vale Road, Glenroy Barry Plant Marco Sansoe 1 1 1 250000 Unit 2018-10-13 Glenroy 2018 10 2018-10
825437 710 Lardners Track, Warragul West Clark NextRE Anthony Rabl 0 0 0 1835000 Residential Land 2018-10-13 Warragul West 2018 10 2018-10
74329 38-40 Coolangatta Drive, Clifton Springs RT Edgar Chris Schumann 3 5 2 810000 House 2018-10-15 Clifton Springs 2018 10 2018-10
74328 38-40 Coolangatta Drive, Clifton Springs RT Edgar Andy Ingham 3 5 2 810000 House 2018-10-15 Clifton Springs 2018 10 2018-10
145717 30 Spinifex Street, Cairnlea hockingstuart George Yacoubian 2 4 2 725000 House 2018-10-27 Cairnlea 2018 10 2018-10
145716 30 Spinifex Street, Cairnlea hockingstuart Caroline Springs Ash Dubash 2 4 2 725000 House 2018-10-27 Cairnlea 2018 10 2018-10
578411 21 Bareena Drive, Mount Eliza Lupton Ferguson Real Estate Dominic Salvato 2 4 4 1225000 House 2018-10-29 Mount Eliza 2018 10 2018-10
715683 4 Bridgewater Road, Seville East Bell Real Estate David Carroll 2 4 1 625000 House 2018-11-01 Seville East 2018 11 2018-11
715682 4 Bridgewater Road, Seville East Bell Real Estate Elliot Bell 2 4 1 625000 House 2018-11-01 Seville East 2018 11 2018-11
86594 173 Don Street, Bendigo Tweed Sutherland First National Helen Ashby 1 3 1 550000 House 2018-11-07 Bendigo 2018 11 2018-11
86595 173 Don Street, Bendigo McKean McGregor Real Estate Bec Allen 1 3 1 550000 House 2018-11-07 Bendigo 2018 11 2018-11
365066 15 Birkenhead Drive, Grovedale One Agency Mark Mitchell Real Estate Mark Mitchell 1 4 4 485000 House 2018-11-12 Grovedale 2018 11 2018-11
365065 15 Birkenhead Drive, Grovedale One Agency Mark Mitchell Real Estate Mark Mitchell 1 4 2 485000 House 2018-11-12 Grovedale 2018 11 2018-11
446336 1/10 Union Street, Kyabram McConnell First National Real Estate Brendan McConnell 2 3 2 365000 Townhouse 2018-11-15 Kyabram 2018 11 2018-11
658440 7098 Princes Highway, Tyrendarra Portland Seaview Real Estate Kylie Capuano 1 1 0 160000 House 2018-11-23 Tyrendarra 2018 11 2018-11
658439 7098 Princes Highway, Tyrendarra Portland Seaview Real Estate Kylie Capuano 1 1 0 160000 Lifestyle 2018-11-23 Tyrendarra 2018 11 2018-11
825201 2/4 Koroit Street, Warragul First National Warragul Stuart Brock 2 3 2 580000 Townhouse 2018-12-06 Warragul 2018 12 2018-12
825202 2/4 Koroit Street, Warragul Quirk Real Estate Geoff Quirk 2 3 2 580000 Unit 2018-12-06 Warragul 2018 12 2018-12
552920 8 Winterset Close, Mordialloc Purplebricks Ange Sarailis 2 3 5 1375000 House 2018-12-10 Mordialloc 2018 12 2018-12
668835 49 Fishermans Drive, Reefton Bell Real Estate Samantha Price 1 3 0 361000 House 2018-12-11 Reefton 2018 12 2018-12
34654 9 Hallier Court, Nicholson East Gippsland & Lakes Real Estate Pty Ltd Yvette McCartney 1 3 4 505000 House 2018-12-17 Nicholson 2018 12 2018-12
34653 9 Hallier Court, Nicholson East Gippsland & Lakes Real Estate Pty Ltd Yvette McCartney 1 3 4 505000 Lifestyle 2018-12-17 Nicholson 2018 12 2018-12
587909 1/45 Stanley Avenue, Mount Waverley Buxton Charlie Darlow 2 4 2 1450000 Townhouse 2018-12-18 Mount Waverley 2018 12 2018-12
805168 60 Trevor Crescent, Truganina Ray White Mandeep Tyagi 2 4 2 622500 House 2018-12-18 Truganina 2018 12 2018-12
805169 60 Trevor Crescent, Truganina Ray White Mandeep Tyagi 0 0 0 622500 Residential Land 2018-12-18 Truganina 2018 12 2018-12
587195 1/45 Stanley Avenue, Mount Waverley Buxton Charlie Darlow 2 4 2 1145000 Townhouse 2018-12-18 Mount Waverley 2018 12 2018-12
19236 132 The Parade, Ascot Vale Brad Teal Real Estate Pty Ltd None 1 3 0 985000 House 2018-12-20 Ascot Vale 2018 12 2018-12
18806 132 The Parade, Ascot Vale Brad Teal Real Estate Pty Ltd None 1 3 0 667000 House 2018-12-20 Ascot Vale 2018 12 2018-12

3750 rows × 13 columns

Finding a pattern or algorithm to clean these rows neatly is going to be hard, since the total number of these rows is the low amount of 1722 compared to over 700000 rows in the dataset, I'll just use drop function to remove the duplicate rows and not taking into account which row it'll keep or which one it'll delete.

In [55]:
clean.drop(clean[clean[['address','sold_date']].duplicated()].index, axis=0, inplace=True)
In [56]:
clean[['address','sold_date']].duplicated().sum()
Out[56]:
0
In [58]:
clean.to_csv('SOLD_complete_cleaned.csv')

Visualizations and Analysis

In [60]:
sb.countplot(data=clean, x='property_type',color='gray', order=clean.property_type.value_counts().index)
plt.xticks(rotation=90);

3 bedroom properties are the most common type sold on the website, after that comes 4 and 2 bedroom properties.

In [61]:
plt.hist(data=clean, x='beds', bins=np.arange(.5,8.5,1), rwidth=.9)
plt.xlabel('Number of bedrooms')
plt.title('Bedrooms');

The majority of properties have 1 or 2 bathrooms.

In [62]:
plt.hist(data=clean, x='baths', bins=np.arange(.5,7.5,1), rwidth=.9);
plt.xlabel('Number of bathrooms')
plt.title('Bathrooms');

Most properties have 1 or 2 car park spaces, the values for 3 and more car parks may not be very accurate as the definition of car park varies based on the advertisers perspective, some assume the maximum number of cars that can be parked on the property and some assume the designed car parks and garages.

In [63]:
plt.hist(data=clean, x='cars', bins=np.arange(.5,9.5,1), rwidth=.9);
plt.xlabel('Number of car parks')
plt.title('Car parks');
In [64]:
sb.boxplot(data = clean[(clean.beds>0) & (clean.price>0)], x = 'beds', y = 'price', color='gray');
In [65]:
sb.boxplot(data = clean[(clean.baths>0) & (clean.price>0)], x = 'baths', y = 'price', color='gray');
In [66]:
sb.boxplot(data = clean[(clean.cars>0) & (clean.price>0)], x = 'cars', y = 'price', color='gray');
In [67]:
#clean[clean.price>0].groupby(['property_type']).price.mean().sort_values(ascending=False)
plt.barh(y=clean[clean.price>0].groupby(['property_type']).price.mean().sort_values(ascending=False).index,
        width=clean[clean.price>0].groupby(['property_type']).price.mean().sort_values(ascending=False))
plt.xticks(rotation=30);
plt.title('Average price of different property types')
plt.xlabel('Price');

It's interesting that average townhouse price is more than average house price. Probabely because townhouses are built in more expensive suburbs where property prices are high enough to make building multiple townhouses instead of 1 house economical.

The figure below show the price distribution, as the majority of properties are priced less than 3 million we will zoom in a bit to see what's going on.

In [68]:
plt.hist(data=clean, x='price', bins=np.arange(1000,5000000,100000), rwidth=.8);
plt.xlabel('Price')
plt.title('Price range');
In [69]:
plt.hist(data=clean, x ='price', bins=np.arange(100000, 3000000, 100000), rwidth=.9);
plt.xlabel('Price')
plt.title('Price range');

The largest price bin for all properties is 350000 to 450000 and the distribution is skewd to the right.
Interestingly there is a gap in the 700000 to 800000 price range, it appears that 700's is not a popular bracket to price a property.

In [70]:
plt.hist(data=clean, x ='price', bins=np.arange(100000, 1500000, 50000), rwidth=.9);
plt.xlabel('Price')
plt.title('Price range');
In [71]:
plt.barh(y= clean.agency.value_counts()[:20].index, width=clean.agency.value_counts()[:20])
plt.title('Top agencies based on the number of properties sold')
plt.xlabel('Count');

Ray White and Barry Plant have got the lead by a large margin and are the top real estate agencies in Victoria

In [72]:
plt.barh(y= (clean[clean.price>0].groupby(['agency']).price.mean()/clean[clean.price>0]
             .groupby(['agency']).price.count()).sort_values(ascending=False)[:20].index, 
         width=(clean[clean.price>0].groupby(['agency']).price.mean()/clean[clean.price>0]
                .groupby(['agency']).price.count()).sort_values(ascending=False)[:20]);
plt.title('Average property price sold by top agencies')
plt.xlabel('Price');

This chart excludes the properties with no sold price, therefor the metrics are affected comparing to the previous chart.

In [73]:
plt.barh(y= clean.agent_name.value_counts()[2:20].index, width=clean.agent_name.value_counts()[2:20])
plt.title('Number of properties sold by top agents')
plt.xlabel('Count');
In [74]:
plt.barh(y= (clean[clean.price>0].groupby(['agent_name']).price.mean()/clean[clean.price>0]
             .groupby(['agent_name']).price.count()).sort_values(ascending=False)[:20].index, 
         width=(clean[clean.price>0].groupby(['agent_name']).price.mean()/clean[clean.price>0]
                .groupby(['agent_name']).price.count()).sort_values(ascending=False)[:20]);
plt.title('Average property price sold by top agents')
plt.xlabel('Price');

This chart may not be the best repsentative of real estate agents as by selling only one property with a very high price the agent can get on top of this chart. I belive number of properties sold is the better estimator.

In [75]:
plt.barh(y= clean.suburb.value_counts()[:20].index, width=clean.suburb.value_counts()[:20])
plt.title('Number of properties sold in top suburbs')
plt.xlabel('Count');

The top 3 most active suburbs based on the number of properties sold are all in the same area in south eastern Melbourne suburbs. It raises the question, what was or is going on in these suburbs? Are they being developed? What makes them so special that so many properties are being sold there?

Perhaps later on I can make a heat map on top of the actual map of Melbourne to visualise and connect the numbers to actual locations on the map.

In [76]:
sb.countplot(data=clean, x=clean.sold_date.apply(lambda x : x.month),color='gray')
plt.xlabel('Sold date');
plt.title('Distribution of sold properties based on the month');
In [77]:
plt.bar(x=clean[clean.price>0].year.value_counts().index.sort_values()[-12:],
        height=clean[clean.price>0].groupby(['year']).price.mean()[-12:])
plt.xticks(np.arange(2008,2020,1),rotation=45);
plt.title('Average property price');
In [78]:
plt.bar(x=clean[clean.price>0].year.value_counts().index.sort_values()[-12:],
        height=clean[clean.price>0].groupby(['year']).price.median()[-12:])
plt.xticks(np.arange(2008,2020,1),rotation=45);
plt.title('Median property price');

This chart shows very interesting insights into properties price fluctuations during the year, as we can see in the chart avergae and median property prices are both significantly lower in January each year. If we compare that to March, 2 month later, the difference is roughly 20% cheaper which is huge.

In [79]:
tt1 = clean[(clean.price>0)].query('sold_date>"2007-12-31" & sold_date<"2019-01-01"').copy()
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(tt1.groupby(['month']).price.median());
ax.plot(tt1.groupby(['month']).price.mean());
plt.title('Median and Average property prices during the year (2008-2018)')
plt.legend(['Median','Average'])
plt.xticks(np.arange(1,13,1),['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']);
In [80]:
plt.bar(x=clean[clean.price>0].year.value_counts().index.sort_values()[-12:],
        height=clean[clean.price>0].groupby(['year']).price.mean()[-12:])
plt.xticks(np.arange(2008,2020,1),rotation=45);
plt.title('Average property price');
In [81]:
plt.bar(x=clean[clean.price>0].year.value_counts().index.sort_values()[-12:],
        height=clean[clean.price>0].groupby(['year']).price.median()[-12:])
plt.xticks(np.arange(2008,2020,1),rotation=45);
plt.title('Median property price');

Comparing price trends between 2 or more subsets can give us excellent insight. Therefor I'll compare different subsets of the dataset that I think can be interestin to compare in the following charts.

In [82]:
tt1 = clean[(clean.price>0) &(clean.property_type=='House')].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.price>0) &(clean.property_type=='Townhouse')].query('sold_date>"2007-12-31"').copy()
tt3 = clean[(clean.price>0) &(clean.property_type=='Unit')].query('sold_date>"2007-12-31"').copy()
tt4 = clean[(clean.price>0) &(clean.property_type=='Apartment')].query('sold_date>"2007-12-31"').copy()
grouped1 = tt1.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4.set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(grouped1.price.count().dropna());
ax.plot(grouped2.price.count().dropna());
ax.plot(grouped3.price.count().dropna());
ax.plot(grouped4.price.count().dropna());
plt.title('Number of sold properties')
plt.legend(['House','Unit', 'Townhouse','Apartment']);
In [83]:
tt1 = clean[(clean.price>0) &(clean.property_type=='House')].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.price>0) &(clean.property_type=='Townhouse')].query('sold_date>"2007-12-31"').copy()
tt3 = clean[(clean.price>0) &(clean.property_type=='Unit')].query('sold_date>"2007-12-31"').copy()
tt4 = clean[(clean.price>0) &(clean.property_type=='Apartment')].query('sold_date>"2007-12-31"').copy()
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(tt1.groupby(['month']).price.mean());
ax.plot(tt2.groupby(['month']).price.mean());
ax.plot(tt3.groupby(['month']).price.mean());
ax.plot(tt4.groupby(['month']).price.mean());
plt.title('Average property prices during the year (2008-2019) based on property type')
plt.legend(['House','Townhouse','Unit','Apartment'])
plt.xticks(np.arange(1,13,1),['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']);

First let's take a look at the price trend between 2 suburbs that I know and have lived before.

In [84]:
tt1 = clean[(clean.price>0) & (clean.suburb=='Melton')].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.price>0) & (clean.suburb=='St Albans')].query('sold_date>"2007-12-31"').copy()
grouped1 = tt1.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2.set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(grouped1.price.mean().dropna());
ax.plot(grouped2.price.mean().dropna());
plt.legend(['Melton','st albans']);

The number of sold houses is far larger than any other residential property type and it has grown over the years.

In [85]:
tt1 = clean[(clean.property_type=='House')].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.property_type=='Unit')].query('sold_date>"2007-12-31"').copy()
tt3 = clean[(clean.property_type=='Townhouse')].query('sold_date>"2007-12-31"').copy()
tt4 = clean[(clean.property_type=='Apartment')].query('sold_date>"2007-12-31"').copy()
grouped1 = tt1.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4.set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(grouped1.price.count().dropna());
ax.plot(grouped2.price.count().dropna());
ax.plot(grouped3.price.count().dropna());
ax.plot(grouped4.price.count().dropna());
plt.title('Number of sold properties')
plt.legend(['House','Unit', 'Townhouse','Apartment']);

Appears Units, Townhoueses and Houses are pretty correlated.

In [86]:
tt1 = clean[(clean.price>0) & (clean.property_type=='House')].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.price>0) & (clean.property_type=='Unit')].query('sold_date>"2007-12-31"').copy()
tt3 = clean[(clean.price>0) & (clean.property_type=='Townhouse')].query('sold_date>"2007-12-31"').copy()
tt4 = clean[(clean.price>0) & (clean.property_type=='Apartment')].query('sold_date>"2007-12-31"').copy()
grouped1 = tt1.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3.set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4.set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 4))
ax = fig.add_subplot(111)
ax.plot(grouped1.price.median().dropna());
ax.plot(grouped2.price.median().dropna());
ax.plot(grouped3.price.median().dropna());
ax.plot(grouped4.price.median().dropna());
plt.title('Median price of different property types')
plt.legend(['House','Unit', 'Townhouse','Apartment']);

This below chart show the average price of different property types as the number of bedrooms change. We can clearly see in 2 bedroom properties, all 3 major property types are in the same ball park excep Unit which is slightly cheaper on average. It is in 3 bedrooms properties that the averages really change, we can clearly see the average price for 3 bedrooms properties is highest for Apartment, then Townhouse, then House and finally Units.

In [87]:
tt1 = clean[(clean.price>0) & (clean.property_type=='House')].query('sold_date>"2007-12-31" & sold_date<"2019-01-01"').copy()
tt2 = clean[(clean.price>0) & (clean.property_type=='Unit')].query('sold_date>"2007-12-31" & sold_date<"2019-01-01"').copy()
tt3 = clean[(clean.price>0) & (clean.property_type=='Townhouse')].query('sold_date>"2007-12-31" & sold_date<"2019-01-01"').copy()
tt4 = clean[(clean.price>0) & (clean.property_type=='Apartment')].query('sold_date>"2007-12-31" & sold_date<"2019-01-01"').copy()
grouped1 = tt1[tt1.beds==2].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.beds==2].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.beds==2].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.beds==2].set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 12))
ax = fig.add_subplot(311)
ax.plot(grouped1.price.mean().dropna());
ax.plot(grouped2.price.mean().dropna());
ax.plot(grouped3.price.mean().dropna());
ax.plot(grouped4.price.mean().dropna());
plt.title('2 bedrooms')
plt.legend(['House','Unit', 'Townhouse', 'Apartment']);
grouped1 = tt1[tt1.beds==3].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.beds==3].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.beds==3].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.beds==3].set_index('sold_date').groupby(pd.TimeGrouper('M'))
az = fig.add_subplot(312)
az.plot(grouped1.price.mean().dropna());
az.plot(grouped2.price.mean().dropna());
az.plot(grouped3.price.mean().dropna());
az.plot(grouped4.price.mean().dropna());
plt.title('3 bedrooms')
plt.legend(['House','Unit', 'Townhouse', 'Apartment']);
grouped1 = tt1[tt1.beds==4].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.beds==4].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.beds==4].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.beds==4].set_index('sold_date').groupby(pd.TimeGrouper('M'))
ac = fig.add_subplot(313)
ac.plot(grouped1.price.mean().dropna());
ac.plot(grouped2.price.mean().dropna());
ac.plot(grouped3.price.mean().dropna());
ac.plot(grouped4.price.mean().dropna());
plt.title('4 bedrooms')
plt.legend(['House','Unit', 'Townhouse', 'Apartment']);
In [88]:
tt1 = clean[(clean.price>0) & (clean.beds==1)].query('sold_date>"2007-12-31"').copy()
tt2 = clean[(clean.price>0) & (clean.beds==2)].query('sold_date>"2007-12-31"').copy()
tt3 = clean[(clean.price>0) & (clean.beds==3)].query('sold_date>"2007-12-31"').copy()
tt4 = clean[(clean.price>0) & (clean.beds==4)].query('sold_date>"2007-12-31"').copy()
grouped1 = tt1[tt1.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
fig = plt.figure(figsize=(15, 12))
ax = fig.add_subplot(411)
ax.plot(grouped1.price.mean().dropna());
ax.plot(grouped2.price.mean().dropna());
ax.plot(grouped3.price.mean().dropna());
ax.plot(grouped4.price.mean().dropna());
plt.title('House prices based on number of bedrooms')
plt.legend(['1','2', '3', '4']);
grouped1 = tt1[tt1.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
az = fig.add_subplot(412)
az.plot(grouped1.price.mean().dropna());
az.plot(grouped2.price.mean().dropna());
az.plot(grouped3.price.mean().dropna());
az.plot(grouped4.price.mean().dropna());
plt.title('Townhouse prices based on number of bedrooms')
plt.legend(['1','2', '3', '4']);
grouped1 = tt1[tt1.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
ac = fig.add_subplot(413)
ac.plot(grouped1.price.mean().dropna());
ac.plot(grouped2.price.mean().dropna());
ac.plot(grouped3.price.mean().dropna());
ac.plot(grouped4.price.mean().dropna());
plt.title('Unit prices based on number of bedrooms')
plt.legend(['1','2', '3', '4']);
grouped1 = tt1[tt1.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped2 = tt2[tt2.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped3 = tt3[tt3.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
grouped4 = tt4[tt4.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
av = fig.add_subplot(414)
av.plot(grouped1.price.mean().dropna());
av.plot(grouped2.price.mean().dropna());
av.plot(grouped3.price.mean().dropna());
av.plot(grouped4.price.mean().dropna());
plt.title('Apartment prices based on number of bedrooms')
plt.legend(['1','2', '3', '4']);

I'm going to calculate the average price increase in all suburbs between 2013 and 2018 and then pick the fastest growing ones to plot. Comparing the suburbs visually by looking at the charts would be challenging.

In [89]:
tem = pd.DataFrame()
tem['name'] = clean.groupby(['suburb']).address.count().index
dd = tem['name'].apply(lambda x : clean[clean.suburb==x].property_type.value_counts())
dd = dd.fillna(0)
tem['count_house'] = dd.House
tem['count_townhouse'] = dd.Townhouse
tem['count_unit'] = dd.Unit
tem['count_apartment'] = dd.Apartment
In [90]:
b = clean[(clean.price>0) & (clean.property_type=='Unit')].query('sold_date>"2007-12-31"').copy()
g = b.set_index('sold_date').groupby(pd.TimeGrouper('Y'))
fig = plt.figure(figsize=(15, 12))
ax = fig.add_subplot(411)
ax.plot(g.price.mean().dropna());
In [91]:
a = tem[tem.count_unit > 300]
for i in a['name']:
    b = clean[(clean.price>0) & (clean.property_type=='Townhouse') & (clean.suburb == i)].query('sold_date>"2007-12-31"').copy()
    g = b.set_index('sold_date').groupby(pd.TimeGrouper('Y'))
    fig = plt.figure(figsize=(15, 12))
    ax = fig.add_subplot(411)
    ax.plot(g.price.mean().dropna());
    plt.title(i)
In [92]:
a = tem[tem.count_unit > 500]
for i in a['name']:
    b = clean[(clean.price>0) & (clean.property_type=='Unit') & (clean.suburb == i)].query('sold_date>"2007-12-31"').copy()
    g = b.set_index('sold_date').groupby(pd.TimeGrouper('Y'))
    fig = plt.figure(figsize=(15, 12))
    ax = fig.add_subplot(411)
    ax.plot(g.price.mean().dropna());
    plt.title(i)
In [93]:
a = tem[tem.count_apartment>500]
for i in a['name']:
    b = clean[(clean.price>0) & (clean.property_type=='Apartment') & (clean.suburb == i)].query('sold_date>"2007-12-31"').copy()
    g = b.set_index('sold_date').groupby(pd.TimeGrouper('Y'))
    fig = plt.figure(figsize=(15, 12))
    ax = fig.add_subplot(411)
    ax.plot(g.price.mean().dropna());
    plt.title(i)

I'll make a function to make it easier to check out the price trends in different suburbs.

In [94]:
def plott(aa,bb,cc,dd):
    tt1 = clean[(clean.price>0) & (clean.suburb==aa)].query('sold_date>"2007-12-31"').copy()
    tt2 = clean[(clean.price>0) & (clean.suburb==bb)].query('sold_date>"2007-12-31"').copy()
    tt3 = clean[(clean.price>0) & (clean.suburb==cc)].query('sold_date>"2007-12-31"').copy()
    tt4 = clean[(clean.price>0) & (clean.suburb==dd)].query('sold_date>"2007-12-31"').copy()
    grouped1 = tt1[tt1.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped2 = tt2[tt2.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped3 = tt3[tt3.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped4 = tt4[tt4.property_type=='House'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    fig = plt.figure(figsize=(15, 12))
    ax = fig.add_subplot(411)
    ax.plot(grouped1.price.mean().dropna());
    ax.plot(grouped2.price.mean().dropna());
    ax.plot(grouped3.price.mean().dropna());
    ax.plot(grouped4.price.mean().dropna());
    plt.title('House')
    plt.legend([aa,bb,cc,dd]);
    grouped1 = tt1[tt1.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped2 = tt2[tt2.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped3 = tt3[tt3.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped4 = tt4[tt4.property_type=='Unit'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    az = fig.add_subplot(412)
    az.plot(grouped1.price.mean().dropna());
    az.plot(grouped2.price.mean().dropna());
    az.plot(grouped3.price.mean().dropna());
    az.plot(grouped4.price.mean().dropna());
    plt.title('Unit')
    plt.legend([aa,bb,cc,dd]);
    grouped1 = tt1[tt1.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped2 = tt2[tt2.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped3 = tt3[tt3.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped4 = tt4[tt4.property_type=='Townhouse'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    ac = fig.add_subplot(413)
    ac.plot(grouped1.price.mean().dropna());
    ac.plot(grouped2.price.mean().dropna());
    ac.plot(grouped3.price.mean().dropna());
    ac.plot(grouped4.price.mean().dropna());
    plt.title('Townhouse')
    plt.legend([aa,bb,cc,dd]);
    grouped1 = tt1[tt1.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped2 = tt2[tt2.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped3 = tt3[tt3.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    grouped4 = tt4[tt4.property_type=='Apartment'].set_index('sold_date').groupby(pd.TimeGrouper('M'))
    ac = fig.add_subplot(414)
    ac.plot(grouped1.price.mean().dropna());
    ac.plot(grouped2.price.mean().dropna());
    ac.plot(grouped3.price.mean().dropna());
    ac.plot(grouped4.price.mean().dropna());
    plt.title('Apartment')
    plt.legend([aa,bb,cc,dd]);
In [95]:
aa=clean.suburb.value_counts()[:20].index[0]
bb=clean.suburb.value_counts()[:20].index[1]
cc=clean.suburb.value_counts()[:20].index[2]
dd=clean.suburb.value_counts()[:20].index[4]
plott(aa,bb,cc,dd)
In [96]:
aa='Delacombe'
bb='Lake Gardens'
cc='Wendouree'
dd='Alfredton'
plott(aa,bb,cc,dd)

To compare suburbs with each other I'll pick the busiest suburbs based on number of properties sold, then I'll calculate the difference in property median price each year and average the differences while giving higher weights to recent years.

In [97]:
def average_property_growth(sub,ptype):
    return clean[(clean.suburb==sub) & (clean.price>10000) & (clean.property_type==ptype)].query(
        'sold_date>"2007-12-31" & sold_date < "2019-01-01"').groupby(
        ['year']).price.median().pct_change()
In [98]:
def average_property_growth_alltypes(sub):
    return clean[(clean.suburb==sub) & (clean.price>10000)].query(
        'sold_date>"2007-12-31" & sold_date < "2019-01-01"').groupby(
        ['year']).price.median().pct_change()
In [99]:
top100 = clean.groupby(['suburb']).address.count().sort_values(ascending=False)[:100]
In [100]:
subg2 = pd.DataFrame()
for sub in top100.index:    
    a = average_property_growth_alltypes(sub)
    subg2 = subg2.append({'name': sub, 'growth': a}, ignore_index=True)
In [101]:
subg2['mean_growth']=subg2.growth.apply(lambda x : (x.values[1:]*[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2][-len(x.values[1:]):]).mean())
In [102]:
subg2.sort_values(by='mean_growth',ascending=False)[:10]
Out[102]:
growth name mean_growth
90 year 2008 NaN 2009 1.152990 2010 ... Cowes 0.311739
63 year 2008 NaN 2009 1.227392 2010 ... Ocean Grove 0.217979
59 year 2008 NaN 2009 0.173333 2010 ... Bacchus Marsh 0.213914
64 year 2008 NaN 2009 1.874194 2010 ... Glen Iris 0.213088
50 year 2008 NaN 2009 -0.559543 2010 ... Drouin 0.208858
58 year 2008 NaN 2009 0.149013 2010 ... Mildura 0.175286
93 year 2008 NaN 2011 1.194444 2012 ... Warrnambool 0.171404
92 year 2008 NaN 2009 0.333333 2010 ... Mentone 0.170965
79 year 2008 NaN 2009 -0.015228 2010 ... Kew 0.156426
36 year 2008 NaN 2009 0.126316 2010 ... Frankston South 0.151961
In [103]:
subg2.to_csv('top100_suburb_growth_all.csv',index=False)
In [104]:
plt.barh(y=subg2.sort_values(by='mean_growth',ascending=False)[:10].name,
        width=subg2.sort_values(by='mean_growth',ascending=False)[:10].mean_growth)
plt.xticks(rotation=0)
plt.title('Average of annual median property price change in top 100 most traded suburbs');

Now let's do the same but this time for each type of property separately. I'll check to top 100 suburbs for houses and top 50 suburbs for the other 3 property types.
To make the comparison fair, I'll give increasing weight to more recent years.

In [105]:
subg = pd.DataFrame()
for sub in tem.sort_values(by='count_house',ascending=False)[:100].name:    
    a = average_property_growth(sub,'House')
    subg = subg.append({'name': sub, 'house_growth': a}, ignore_index=True)
for sub in tem.sort_values(by='count_townhouse',ascending=False)[:50].name:    
    b = average_property_growth(sub,'Townhouse')
    subg = subg.append({'name': sub, 'townhouse_growth': b}, ignore_index=True)
for sub in tem.sort_values(by='count_unit',ascending=False)[:50].name:    
    c = average_property_growth(sub,'Unit')
    subg = subg.append({'name': sub, 'unit_growth': c}, ignore_index=True)
for sub in tem.sort_values(by='count_apartment',ascending=False)[:50].name:    
    d = average_property_growth(sub,'Apartment')
    subg = subg.append({'name': sub, 'apartment_growth': d}, ignore_index=True)
In [106]:
subg['h_mean']=subg.house_growth[:100].apply(lambda x : (x[1:]*[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2][-len(x.values[1:]):]).mean())
subg['t_mean']=subg.townhouse_growth[100:150].apply(lambda x : (x[1:]*[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2][-len(x.values[1:]):]).mean())
subg['u_mean']=subg.unit_growth[150:200].apply(lambda x : (x[1:]*[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2][-len(x.values[1:]):]).mean())
subg['a_mean']=subg.apartment_growth[200:250].apply(lambda x : (x[1:]*[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2][-len(x.values[1:]):]).mean())
In [107]:
subg.sort_values(by='t_mean',ascending=False)
Out[107]:
house_growth name townhouse_growth unit_growth apartment_growth h_mean t_mean u_mean a_mean
133 NaN Kew year 2009 NaN 2010 0.571429 2012 ... NaN NaN NaN 0.288952 NaN NaN
137 NaN Frankston year 2009 NaN 2010 0.512121 2011 ... NaN NaN NaN 0.168049 NaN NaN
119 NaN Glen Waverley year 2008 NaN 2009 0.263158 2010 ... NaN NaN NaN 0.150139 NaN NaN
117 NaN Kensington year 2008 NaN 2009 0.141055 2010 ... NaN NaN NaN 0.145176 NaN NaN
101 NaN Bentleigh East year 2009 NaN 2010 0.406897 2011 ... NaN NaN NaN 0.141644 NaN NaN
120 NaN Highett year 2008 NaN 2009 0.213904 2010 ... NaN NaN NaN 0.139988 NaN NaN
104 NaN Cheltenham year 2008 NaN 2009 0.421252 2010 ... NaN NaN NaN 0.139845 NaN NaN
146 NaN Black Rock year 2008 NaN 2009 0.203810 2010 ... NaN NaN NaN 0.136412 NaN NaN
138 NaN Essendon year 2008 NaN 2010 0.336735 2011 ... NaN NaN NaN 0.136069 NaN NaN
105 NaN Mount Waverley year 2008 NaN 2009 0.201598 2010 ... NaN NaN NaN 0.132407 NaN NaN
109 NaN Mornington year 2008 NaN 2009 0.082873 2010 ... NaN NaN NaN 0.131731 NaN NaN
115 NaN Clayton year 2008 NaN 2009 0.134709 2010 ... NaN NaN NaN 0.131035 NaN NaN
127 NaN Beaumaris year 2008 NaN 2009 -0.051095 2010 ... NaN NaN NaN 0.126762 NaN NaN
130 NaN Altona North year 2008 NaN 2009 -0.055556 2010 ... NaN NaN NaN 0.125977 NaN NaN
142 NaN Glen Iris year 2010 NaN 2011 0.107143 2012 ... NaN NaN NaN 0.125242 NaN NaN
110 NaN Bentleigh year 2008 NaN 2009 0.060100 2010 ... NaN NaN NaN 0.124798 NaN NaN
108 NaN Mentone year 2008 NaN 2009 0.083333 2010 ... NaN NaN NaN 0.123560 NaN NaN
145 NaN Oak Park year 2008 NaN 2009 0.237410 2010 ... NaN NaN NaN 0.121958 NaN NaN
140 NaN Mordialloc year 2008 NaN 2009 0.084444 2010 ... NaN NaN NaN 0.121810 NaN NaN
132 NaN Hampton year 2009 NaN 2010 0.544402 2011 ... NaN NaN NaN 0.119829 NaN NaN
125 NaN Brunswick year 2008 NaN 2009 0.023305 2010 ... NaN NaN NaN 0.116633 NaN NaN
107 NaN Noble Park year 2009 NaN 2010 0.070181 2011 ... NaN NaN NaN 0.112295 NaN NaN
100 NaN Glenroy year 2008 NaN 2009 0.271104 2010 ... NaN NaN NaN 0.110217 NaN NaN
143 NaN Epping year 2008 NaN 2009 0.221922 2010 ... NaN NaN NaN 0.108943 NaN NaN
131 NaN Seaford year 2008 NaN 2009 0.001235 2010 ... NaN NaN NaN 0.107893 NaN NaN
144 NaN Mitcham year 2008 NaN 2009 -0.055769 2010 ... NaN NaN NaN 0.101125 NaN NaN
102 NaN Reservoir year 2008 NaN 2009 0.177812 2010 ... NaN NaN NaN 0.099644 NaN NaN
112 NaN Richmond year 2009 NaN 2010 0.506061 2011 ... NaN NaN NaN 0.099627 NaN NaN
126 NaN Croydon year 2008 NaN 2009 0.054054 2010 ... NaN NaN NaN 0.098736 NaN NaN
141 NaN Broadmeadows year 2009 NaN 2010 0.145299 2011 ... NaN NaN NaN 0.098700 NaN NaN
... ... ... ... ... ... ... ... ... ...
220 NaN Glen Iris NaN NaN year 2008 NaN 2009 0.156944 2010 ... NaN NaN NaN 0.064049
221 NaN Essendon NaN NaN year 2008 NaN 2009 -0.028986 2010 ... NaN NaN NaN 0.050852
222 NaN Hawthorn East NaN NaN year 2008 NaN 2009 0.203438 2010 ... NaN NaN NaN 0.062869
223 NaN Thornbury NaN NaN year 2008 NaN 2009 -0.254373 2010 ... NaN NaN NaN 0.044876
224 NaN Northcote NaN NaN year 2008 NaN 2009 0.548232 2010 ... NaN NaN NaN 0.108331
225 NaN Armadale NaN NaN year 2009 NaN 2010 0.063209 2011 ... NaN NaN NaN 0.071020
226 NaN Elsternwick NaN NaN year 2008 NaN 2009 0.157074 2010 ... NaN NaN NaN 0.066883
227 NaN Kensington NaN NaN year 2008 NaN 2009 0.055556 2010 ... NaN NaN NaN 0.066264
228 NaN Brunswick West NaN NaN year 2008 NaN 2009 -0.036545 2010 ... NaN NaN NaN 0.055918
229 NaN East Melbourne NaN NaN year 2008 NaN 2009 -0.188293 2010 ... NaN NaN NaN 0.065029
230 NaN Maribyrnong NaN NaN year 2008 NaN 2009 0.119475 2010 ... NaN NaN NaN 0.060371
231 NaN Kew NaN NaN year 2008 NaN 2009 -0.071579 2010 ... NaN NaN NaN 0.035667
232 NaN Box Hill NaN NaN year 2008 NaN 2009 0.491089 2010 ... NaN NaN NaN 0.102571
233 NaN Collingwood NaN NaN year 2008 NaN 2009 0.580364 2010 ... NaN NaN NaN 0.116343
234 NaN Brunswick East NaN NaN year 2008 NaN 2009 -0.093373 2010 ... NaN NaN NaN 0.006576
235 NaN Preston NaN NaN year 2008 NaN 2009 0.243664 2010 ... NaN NaN NaN 0.048072
236 NaN Malvern East NaN NaN year 2008 NaN 2009 0.166775 2010 ... NaN NaN NaN 0.057045
237 NaN West Melbourne NaN NaN year 2008 NaN 2009 0.180488 2010 ... NaN NaN NaN 0.030302
238 NaN Dandenong NaN NaN year 2008 NaN 2009 -0.267206 2010 ... NaN NaN NaN 0.074326
239 NaN Fitzroy NaN NaN year 2008 NaN 2009 0.261538 2010 ... NaN NaN NaN 0.143176
240 NaN Abbotsford NaN NaN year 2008 NaN 2009 0.804615 2010 ... NaN NaN NaN 0.083784
241 NaN Moonee Ponds NaN NaN year 2008 NaN 2009 0.015152 2010 ... NaN NaN NaN 0.054242
242 NaN Brighton NaN NaN year 2008 NaN 2009 0.186879 2010 ... NaN NaN NaN 0.056256
243 NaN St Kilda West NaN NaN year 2008 NaN 2009 -0.145349 2010 ... NaN NaN NaN 0.039585
244 NaN Murrumbeena NaN NaN year 2008 NaN 2009 0.075077 2010 ... NaN NaN NaN 0.122198
245 NaN Ascot Vale NaN NaN year 2008 NaN 2009 0.093776 2010 ... NaN NaN NaN 0.045217
246 NaN Malvern NaN NaN year 2009 NaN 2010 0.306393 2011 ... NaN NaN NaN 0.102897
247 NaN Glen Huntly NaN NaN year 2008 NaN 2009 0.526235 2010 ... NaN NaN NaN 0.124836
248 NaN Coburg NaN NaN year 2008 NaN 2009 -0.236842 2010 ... NaN NaN NaN 0.045943
249 NaN Flemington NaN NaN year 2008 NaN 2009 -0.008834 2010 ... NaN NaN NaN 0.060244

250 rows × 9 columns

In [108]:
fig=plt.figure(figsize=(16,16))
ax = fig.add_subplot(411)
ax.plot(subg.house_growth[subg.sort_values(by='h_mean',ascending=False).index[0]][1:])
ax.plot(subg.house_growth[subg.sort_values(by='h_mean',ascending=False).index[1]][1:])
ax.plot(subg.house_growth[subg.sort_values(by='h_mean',ascending=False).index[2]][1:])
ax.plot(subg.house_growth[subg.sort_values(by='h_mean',ascending=False).index[3]][1:])
plt.title('Annual growth rate of Houses in the top 4 suburbs')
plt.legend([subg.sort_values(by='h_mean',ascending=False).name.values[0],subg.sort_values(by='h_mean',ascending=False).name.values[1],
            subg.sort_values(by='h_mean',ascending=False).name.values[2],subg.sort_values(by='h_mean',ascending=False).name.values[3]])
az = fig.add_subplot(412)
az.plot(subg.townhouse_growth[subg.sort_values(by='t_mean',ascending=False).index[0]][1:])
az.plot(subg.townhouse_growth[subg.sort_values(by='t_mean',ascending=False).index[1]][1:])
az.plot(subg.townhouse_growth[subg.sort_values(by='t_mean',ascending=False).index[2]][1:])
az.plot(subg.townhouse_growth[subg.sort_values(by='t_mean',ascending=False).index[3]][1:])
plt.title('Annual growth rate of Townhouses in the top 4 suburbs')
plt.legend([subg.sort_values(by='t_mean',ascending=False).name.values[0],subg.sort_values(by='t_mean',ascending=False).name.values[1],
            subg.sort_values(by='t_mean',ascending=False).name.values[2],subg.sort_values(by='t_mean',ascending=False).name.values[3]])
az = fig.add_subplot(413)
az.plot(subg.unit_growth[subg.sort_values(by='u_mean',ascending=False).index[0]][1:])
az.plot(subg.unit_growth[subg.sort_values(by='u_mean',ascending=False).index[1]][1:])
az.plot(subg.unit_growth[subg.sort_values(by='u_mean',ascending=False).index[2]][1:])
az.plot(subg.unit_growth[subg.sort_values(by='u_mean',ascending=False).index[3]][1:])
plt.title('Annual growth rate of Townhouses in the top 4 suburbs')
plt.legend([subg.sort_values(by='u_mean',ascending=False).name.values[0],subg.sort_values(by='u_mean',ascending=False).name.values[1],
            subg.sort_values(by='u_mean',ascending=False).name.values[2],subg.sort_values(by='u_mean',ascending=False).name.values[3]])
az = fig.add_subplot(414)
az.plot(subg.apartment_growth[subg.sort_values(by='a_mean',ascending=False).index[0]][1:])
az.plot(subg.apartment_growth[subg.sort_values(by='a_mean',ascending=False).index[1]][1:])
az.plot(subg.apartment_growth[subg.sort_values(by='a_mean',ascending=False).index[2]][1:])
az.plot(subg.apartment_growth[subg.sort_values(by='a_mean',ascending=False).index[3]][1:])
plt.title('Annual growth rate of Apartments in the top 4 suburbs')
plt.legend([subg.sort_values(by='a_mean',ascending=False).name.values[0],subg.sort_values(by='a_mean',ascending=False).name.values[1],
            subg.sort_values(by='a_mean',ascending=False).name.values[2],subg.sort_values(by='a_mean',ascending=False).name.values[3]]);

It would also be interesting to know how real estate agencies function in different suburbs and whether of not some of them are mosre successful than the other ones.
To do this I categorize them based on the suburbs and then compare thier sold prices in a specific suburb for a specific type of property such a 3 bedroom House.
Narrowing down the dataset too much would result in not having many rows in each investigation and not getting a smooth answer.

In [109]:
agencies = clean.groupby(['agency']).address.count().sort_values(ascending=False)[:50]
In [110]:
suburbs = clean.groupby(['suburb']).address.count().sort_values(ascending=False)[:100]
In [111]:
clean[(clean.suburb=='Pakenham') & (clean.agency=='Ray White') & (clean.price>0) & (clean.year>2017)]
Out[111]:
address agency agent_name baths beds cars price property_type sold_date suburb year month month_year
632679 60 Highland Drive, Pakenham Ray White Claus Zelno 0 0 0 250000 Residential Land 2018-06-13 Pakenham 2018 6 2018-06
634808 1/12 Renlik Court, Pakenham Ray White Jodie Menadue 1 3 2 360000 Unit 2018-11-01 Pakenham 2018 11 2018-11
635877 84 Shearwater Drive, Pakenham Ray White Elizabeth Verleg 1 2 2 405000 House 2018-12-19 Pakenham 2018 12 2018-12
635974 1/35 Princes Highway, Pakenham Ray White Jodie Menadue 1 3 2 410000 Unit 2018-04-12 Pakenham 2018 4 2018-04
636156 4 Brooke Court, Pakenham Ray White Gavin Staindl 1 2 2 415050 House 2018-03-08 Pakenham 2018 3 2018-03
636181 1 Anita Place, Pakenham Ray White None 1 3 2 417500 House 2018-08-31 Pakenham 2018 8 2018-08
636307 63 Pinnacle Drive, Pakenham Ray White Jodie Menadue 2 2 1 420277 House 2018-09-19 Pakenham 2018 9 2018-09
636558 26 Devine Drive, Pakenham Ray White Jodie Menadue 2 4 2 435000 House 2018-11-30 Pakenham 2018 11 2018-11
636629 40 Cascade Way, Pakenham Ray White None 2 3 2 439000 House 2018-01-08 Pakenham 2018 1 2018-01
636634 1/7 Jamieson Court, Pakenham Ray White Gavin Staindl 2 3 2 440000 Unit 2018-11-27 Pakenham 2018 11 2018-11
636638 8 Persimmon Lane, Pakenham Ray White Gavin Staindl 2 3 1 440000 House 2018-10-04 Pakenham 2018 10 2018-10
636642 27 Ascot Park Drive, Pakenham Ray White Jodie Menadue 2 3 1 440000 House 2018-06-13 Pakenham 2018 6 2018-06
636734 8 Martingale Place, Pakenham Ray White Claus Zelno 2 3 2 445000 House 2018-12-14 Pakenham 2018 12 2018-12
636737 6 Wells Street, Pakenham Ray White None 2 3 2 445000 House 2018-08-13 Pakenham 2018 8 2018-08
636800 40 Renam Street, Pakenham Ray White Gavin Staindl 2 4 2 450000 House 2018-11-28 Pakenham 2018 11 2018-11
636809 12 Genoa Grove, Pakenham Ray White Claus Zelno 2 3 2 450000 House 2018-07-03 Pakenham 2018 7 2018-07
636813 20 Melissa Way, Pakenham Ray White None 2 3 2 450000 House 2018-04-18 Pakenham 2018 4 2018-04
636814 5 Arbour Rise, Pakenham Ray White Ben Jusufi 2 2 1 450000 Townhouse 2018-03-29 Pakenham 2018 3 2018-03
636975 61 Fallingwater Drive, Pakenham Ray White Gavin Staindl 2 3 2 455555 House 2018-08-01 Pakenham 2018 8 2018-08
636976 6B Lima Place, Pakenham Ray White None 2 3 2 456000 House 2018-03-26 Pakenham 2018 3 2018-03
636994 8 Armidale Drive, Pakenham Ray White Rachael Dalton 2 3 2 460000 House 2018-12-17 Pakenham 2018 12 2018-12
637011 42 Botham Crescent, Pakenham Ray White Gavin Staindl 2 3 2 460000 House 2018-05-03 Pakenham 2018 5 2018-05
637103 22 Cascade Way, Pakenham Ray White None 2 4 2 465000 House 2018-03-23 Pakenham 2018 3 2018-03
637145 5 Gus Court, Pakenham Ray White Gavin Staindl 2 4 0 466000 House 2018-03-02 Pakenham 2018 3 2018-03
637165 5 Sherriff Rise, Pakenham Ray White Claus Zelno 2 3 4 470000 House 2018-12-20 Pakenham 2018 12 2018-12
637180 11 Glenvista Road, Pakenham Ray White None 2 4 2 470000 House 2018-04-30 Pakenham 2018 4 2018-04
637430 19 Pendula Place, Pakenham Ray White Gavin Staindl 2 3 2 483500 Townhouse 2018-02-14 Pakenham 2018 2 2018-02
637438 2 Wild Cherry Avenue, Pakenham Ray White None 2 3 2 485000 House 2018-06-18 Pakenham 2018 6 2018-06
637441 7 Finton Court, Pakenham Ray White Claus Zelno 1 3 5 485000 House 2018-02-26 Pakenham 2018 2 2018-02
637481 25 Pommel Street, Pakenham Ray White Gavin Staindl 2 4 2 486000 House 2018-08-08 Pakenham 2018 8 2018-08
... ... ... ... ... ... ... ... ... ... ... ... ... ...
638396 64 Greendale Boulevard, Pakenham Ray White Gavin Staindl 2 4 2 560000 House 2018-07-10 Pakenham 2018 7 2018-07
638434 3 Spring Circuit, Pakenham Ray White Claus Zelno 2 4 2 561000 House 2018-10-01 Pakenham 2018 10 2018-10
638479 81 Gallery Way, Pakenham Ray White Jodie Menadue 2 4 2 570000 House 2018-11-22 Pakenham 2018 11 2018-11
638483 61 Moore Mews, Pakenham Ray White Gavin Staindl 2 4 2 570000 House 2018-07-24 Pakenham 2018 7 2018-07
638484 50 Superior Waters, Pakenham Ray White Jodie Menadue 2 4 2 570000 House 2018-04-12 Pakenham 2018 4 2018-04
638486 74 Leigh Drive, Pakenham Ray White Jodie Menadue 2 4 4 570000 House 2018-02-26 Pakenham 2018 2 2018-02
638487 35 Edgeware Close, Pakenham Ray White Claus Zelno 2 4 2 570000 House 2018-01-25 Pakenham 2018 1 2018-01
638528 28 Thomas Place, Pakenham Ray White Jodie Menadue 2 3 2 575000 House 2018-03-09 Pakenham 2018 3 2018-03
638610 55 Bluehills Boulevard, Pakenham Ray White Gavin Staindl 2 4 2 587500 House 2018-02-14 Pakenham 2018 2 2018-02
638649 2B Pinehill Drive, Pakenham Ray White None 0 0 0 591000 Residential Land 2018-04-20 Pakenham 2018 4 2018-04
638651 3 Downing Square, Pakenham Ray White Gavin Staindl 2 3 2 592000 House 2018-04-11 Pakenham 2018 4 2018-04
638652 11 Hopkins Pass, Pakenham Ray White Gavin Staindl 2 4 2 592500 House 2018-06-13 Pakenham 2018 6 2018-06
638659 33 O'Brien Parade, Pakenham Ray White Gavin Staindl 2 4 2 595000 House 2018-04-06 Pakenham 2018 4 2018-04
638751 151 Pakenham Road, Pakenham Ray White Jodie Menadue 1 3 3 611000 House 2018-06-13 Pakenham 2018 6 2018-06
638771 2 Ocean Bend, Pakenham Ray White Claus Zelno 2 4 2 616000 House 2018-06-15 Pakenham 2018 6 2018-06
638801 7 Henry Lawson Drive, Pakenham Ray White Gavin Staindl 2 4 2 625000 House 2018-11-29 Pakenham 2018 11 2018-11
638802 Lot 2, 14 Pinehill Drive, Pakenham Ray White None 0 0 0 625000 Residential Land 2018-08-08 Pakenham 2018 8 2018-08
638804 3 Greenway Drive, Pakenham Ray White Gavin Staindl 2 4 2 625000 House 2018-07-11 Pakenham 2018 7 2018-07
638806 3 Rosalie Court, Pakenham Ray White Gavin Staindl 2 3 2 625000 House 2018-04-11 Pakenham 2018 4 2018-04
638833 16 Worthington Blvd, Pakenham Ray White Peter Khamis 2 4 2 630800 House 2018-07-13 Pakenham 2018 7 2018-07
638865 4 River Red Grove, Pakenham Ray White Gavin Staindl 2 4 4 641000 House 2018-01-24 Pakenham 2018 1 2018-01
638932 13 Greendale Boulevard, Pakenham Ray White Gavin Staindl 2 4 4 660100 House 2018-05-02 Pakenham 2018 5 2018-05
638951 4 Jardine Court, Pakenham Ray White Gavin Staindl 2 4 2 670000 House 2018-11-28 Pakenham 2018 11 2018-11
638952 54 Arthur Phillip Drive, Pakenham Ray White None 2 4 2 670000 House 2018-05-14 Pakenham 2018 5 2018-05
638953 4 Livingstone Boulevard, Pakenham Ray White None 2 4 4 670000 House 2018-04-11 Pakenham 2018 4 2018-04
638965 17 Botanic Drive, Pakenham Ray White Debra Deayton 3 4 2 671000 House 2019-01-03 Pakenham 2019 1 2019-01
639042 32 Waterford Rise, Pakenham Ray White Gavin Staindl 2 5 2 841000 House 2018-02-17 Pakenham 2018 2 2018-02
639045 11 Whiteley Way, Pakenham Ray White None 2 6 3 850000 House 2018-05-16 Pakenham 2018 5 2018-05
639095 19 Pakenham Road, Pakenham Ray White Gavin Staindl 3 5 10 1400000 House 2018-11-16 Pakenham 2018 11 2018-11
639099 240 Pakenham Road, Pakenham Ray White Claus Zelno 2 4 0 1650000 House 2018-09-19 Pakenham 2018 9 2018-09

88 rows × 13 columns

In [112]:
new_2018 = pd.DataFrame()
for i in suburbs.index:
    for j in agencies.index:
        a = clean[(clean.agency== j) & (clean.suburb==i )& (clean.price>0) & (clean.year == 2018)].copy()
        h2 = a[(a.property_type=='House') & (a.beds==2)].price.mean()
        h3 = a[(a.property_type=='House') & (a.beds==3)].price.mean()
        h4 = a[(a.property_type=='House') & (a.beds==4)].price.mean()
        h5 = a[(a.property_type=='House') & (a.beds==5)].price.mean()
        t1 = a[(a.property_type=='Townhouse') & (a.beds==1)].price.mean()
        t2 = a[(a.property_type=='Townhouse') & (a.beds==2)].price.mean()
        t3 = a[(a.property_type=='Townhouse') & (a.beds==3)].price.mean()
        t4 = a[(a.property_type=='Townhouse') & (a.beds==4)].price.mean()
        u1 = a[(a.property_type=='Unit') & (a.beds==1)].price.mean()
        u2 = a[(a.property_type=='Unit') & (a.beds==2)].price.mean()
        u3 = a[(a.property_type=='Unit') & (a.beds==3)].price.mean()
        u4 = a[(a.property_type=='Unit') & (a.beds==4)].price.mean()
        a1 = a[(a.property_type=='Apartment') & (a.beds==1)].price.mean()
        a2 = a[(a.property_type=='Apartment') & (a.beds==2)].price.mean()
        a3 = a[(a.property_type=='Apartment') & (a.beds==3)].price.mean()
        new_2018 = new_2018.append({'suburb':i, 'agency':j, 'h2':h2, 'h3':h3, 'h4':h4, 'h5':h5, 't1':t1, 't2':t2, 't3':t3
                  , 't4':t4, 'u1':u1, 'u2':u2, 'u3':u3, 'u4':u4, 'a1':a1, 'a2':a2, 'a3':a3},ignore_index=True)
In [113]:
new_2018.to_csv('suburb_agency_2018.csv')
In [114]:
new_2018
Out[114]:
a1 a2 a3 agency h2 h3 h4 h5 suburb t1 t2 t3 t4 u1 u2 u3 u4
0 NaN NaN NaN Ray White 413442.333333 499751.617647 5.927333e+05 1.120500e+06 Pakenham NaN 450000.0 491750.000000 NaN NaN NaN 403333.333333 NaN
1 NaN NaN NaN Barry Plant 390000.000000 497537.027778 5.648627e+05 7.920000e+05 Pakenham NaN NaN NaN NaN NaN 378000.0 NaN NaN
2 NaN NaN NaN None NaN 486750.000000 4.950000e+05 NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN hockingstuart NaN 492750.000000 5.800000e+05 NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN Stockdale & Leggo 365000.000000 491727.272727 5.657850e+05 NaN Pakenham NaN NaN 478000.000000 NaN NaN NaN NaN NaN
5 NaN NaN NaN Nelson Alexander NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN Harcourts 402500.000000 502068.115942 5.693660e+05 6.970000e+05 Pakenham NaN NaN NaN NaN NaN 358800.0 420000.000000 NaN
7 NaN NaN NaN Buxton NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN LJ Hooker 365500.000000 476397.435897 5.720400e+05 5.050000e+05 Pakenham NaN 373750.0 559000.000000 NaN NaN 374000.0 422200.000000 NaN
9 NaN NaN NaN Jellis Craig NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
10 NaN NaN NaN Biggin & Scott NaN 512500.000000 5.887143e+05 5.600000e+05 Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
11 NaN NaN NaN OBrien Real Estate 450000.000000 504795.833333 6.094200e+05 6.875000e+05 Pakenham NaN NaN 471333.333333 NaN NaN 376850.0 439600.000000 NaN
12 NaN NaN NaN Fletchers NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
13 NaN NaN NaN Eview Group NaN NaN 6.360000e+05 NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
14 NaN NaN NaN Raine & Horne NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
15 NaN NaN NaN Woodards NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
16 NaN NaN NaN McGrath NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
17 NaN NaN NaN Marshall White NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
18 NaN NaN NaN Hodges NaN 470000.000000 NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
19 NaN NaN NaN Jellis Craig & Company Pty Ltd NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
20 NaN NaN NaN Noel Jones NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
21 NaN NaN NaN RT Edgar NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
22 NaN NaN NaN Philip Webb NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
23 NaN NaN NaN Bell Real Estate NaN 582500.000000 NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
24 NaN NaN NaN hockingstuart NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
25 NaN NaN NaN Sweeney Estate Agents NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
26 NaN NaN NaN Brad Teal Real Estate NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
27 NaN NaN NaN Grant's Estate Agents NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
28 NaN NaN NaN Barry Plant NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
29 NaN NaN NaN Hayeswinckle NaN NaN NaN NaN Pakenham NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
4970 NaN NaN NaN Noel Jones 622000.000000 NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4971 NaN NaN NaN RT Edgar NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4972 NaN NaN NaN Philip Webb NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN 915000.0
4973 NaN NaN NaN Bell Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4974 NaN NaN NaN hockingstuart NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4975 NaN NaN NaN Sweeney Estate Agents NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4976 NaN NaN NaN Brad Teal Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4977 NaN NaN NaN Grant's Estate Agents NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4978 NaN NaN NaN Barry Plant NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4979 NaN NaN NaN Hayeswinckle NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4980 NaN NaN NaN Harcourts Rata & Co NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4981 NaN NaN NaN Alex Scott & Staff NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4982 NaN NaN NaN Jellis Craig NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4983 NaN NaN NaN PRDnationwide NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4984 NaN NaN NaN PRD Nationwide NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4985 NaN NaN NaN Miles Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4986 NaN NaN NaN Gary Peer & Associates NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4987 NaN NaN NaN Love & Co NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4988 NaN NaN NaN Ray White Oakleigh NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4989 NaN NaN NaN Morrison Kleeman Estate Agents Greensborough D... 620000.000000 925977.545455 1.148813e+06 2.008333e+06 Eltham NaN NaN NaN NaN NaN 744275.0 860000.000000 NaN
4990 NaN NaN NaN Landmark Harcourts NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4991 NaN NaN NaN Ray White NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4992 NaN NaN NaN Professionals Methven Group NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4993 NaN NaN NaN Kay & Burton NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4994 NaN NaN NaN Jas Stephens Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4995 NaN NaN NaN First National Real Estate Neilson Partners NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4996 NaN NaN NaN Clark NextRE NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4997 NaN NaN NaN Professionals NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4998 NaN NaN NaN Ballarat Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN
4999 NaN NaN NaN Elders Real Estate NaN NaN NaN NaN Eltham NaN NaN NaN NaN NaN NaN NaN NaN

5000 rows × 17 columns